add missed value based on the value of the column in r

后端 未结 3 2172
心在旅途
心在旅途 2021-01-23 01:24

This is my sample dataset:

   vector1 <-
      data.frame(
        \"name\" = \"a\",
        \"age\" = 10,
        \"fruit\" = c(\"orange\", \"cherry\", \"app         


        
3条回答
  •  清歌不尽
    2021-01-23 01:44

    A solution using dplyr and tidyr. We can use complete to expand the data frame and specify the fill values as 0 to count.

    Notice that I changed your list name from list to fruit_list because it is a bad practice to use reserved words in R to name an object. Also notice that when I created the example data frame I set stringsAsFactors = FALSE because I don't want to create factor columns. Finally, I used lapply instead of for-loop to loop through the list elements.

    library(dplyr)
    library(tidyr)
    
    fruit_list2 <- lapply(fruit_list, function(x){
      x2 <- x %>%
        complete(name, age, fruit = default, tag = c(1, 2), fill = list(count = 0)) %>%
        select(name, age, fruit, count, tag) %>%
        arrange(tag, fruit) %>%
        as.data.frame()
      return(x2)
    })
    
    fruit_list2
    # [[1]]
    #   name age  fruit count tag
    # 1    a  10  apple     0   1
    # 2    a  10 cherry     1   1
    # 3    a  10  mango     0   1
    # 4    a  10 orange     1   1
    # 5    a  10  apple     1   2
    # 6    a  10 cherry     0   2
    # 7    a  10  mango     0   2
    # 8    a  10 orange     0   2
    # 
    # [[2]]
    #   name age  fruit count tag
    # 1    b  33  apple     0   1
    # 2    b  33 cherry     0   1
    # 3    b  33  mango     0   1
    # 4    b  33 orange     0   1
    # 5    b  33  apple     1   2
    # 6    b  33 cherry     0   2
    # 7    b  33  mango     1   2
    # 8    b  33 orange     0   2
    # 
    # [[3]]
    #   name age  fruit count tag
    # 1    c  58  apple     1   1
    # 2    c  58 cherry     1   1
    # 3    c  58  mango     0   1
    # 4    c  58 orange     0   1
    # 5    c  58  apple     0   2
    # 6    c  58 cherry     0   2
    # 7    c  58  mango     0   2
    # 8    c  58 orange     0   2
    

    DATA

    vector1 <-
      data.frame(
        "name" = "a",
        "age" = 10,
        "fruit" = c("orange", "cherry", "apple"),
        "count" = c(1, 1, 1),
        "tag" = c(1, 1, 2),
        stringsAsFactors = FALSE
      )
    vector2 <-
      data.frame(
        "name" = "b",
        "age" = 33,
        "fruit" = c("apple", "mango"),
        "count" = c(1, 1),
        "tag" = c(2, 2),
        stringsAsFactors = FALSE
      )
    vector3 <-
      data.frame(
        "name" = "c",
        "age" = 58,
        "fruit" = c("cherry", "apple"),
        "count" = c(1, 1),
        "tag" = c(1, 1),
        stringsAsFactors = FALSE
      )
    
    fruit_list <- list(vector1, vector2, vector3)
    
    default <- c("cherry", "orange", "apple", "mango")
    

提交回复
热议问题