【问题标题】:How to complete missing factor levels in data frame?如何完成数据框中缺失的因子水平?
【发布时间】:2017-02-19 01:59:38
【问题描述】:

假设我有这样的事情:

df <- data.frame(
      PERSON = c("Peter", "Peter", "Marcel" , "Lisa", "Lisa"),        
      FRUIT = c("Apple", "Peach","Apple", "Apple", "Peach" ), 
      A = c(100, 200, 100, 200, 300), 
      B=c(1,2,3,4,5) )
df$PERSON <- as.factor(df$Person)
df$FRUIT <- factor(df$FRUIT, levels = c("Apple", "Peach", "Coconut"))

结果

str(df): 'data.frame':  5 obs. of  4 variables:
$ PERSON: Factor w/ 3 levels "Lisa","Marcel",..: 3 3 2 1 1
$ FRUIT : Factor w/ 3 levels "Apple","Peach",..: 1 2 1 1 2
$ A     : num  100 200 100 200 300
$ B     : num  1 2 3 4 5

我想扩展这个数据和框架,以便每个人都有所有级别的 FRUIT,如下所示:

 Person FRUIT   A B
1  Peter Apple 100 1
2  Peter Peach 200 2
3  Peter Coconut 0 0
4 Marcel Apple 100 3
5 Marcel Peach 0 0
6 Marcel Coconut 0 0
7   Lisa Apple 200 4
8   Lisa Peach 300 5
9   Lisa Coconut 0 0

AB 的缺失值应该用 0 填充。

我试过tidyr::complete(df$FRUIT, 0),但似乎我用错了这个功能。

【问题讨论】:

    标签: r dataframe tidyr


    【解决方案1】:

    complete 将第一个参数作为“数据”,然后是要扩展的列。默认情况下,fill 为 NA,但我们可以通过在 list 中指定它来将其更改为 0。

    complete(df, PERSON, FRUIT, fill = list(A=0, B = 0))
    

    【讨论】:

    • 它有效,谢谢。是否也可以根据列名构建列表?在现实世界的设置中,要填充 0 的列数是 20。所以要输入的内容很多
    • @barracuda317 在这种情况下尝试complete_library(dplyr); complete_(df, names(df)[1:2]) %&gt;% mutate_each(funs(replace(., is.na(.), 0)), A:B)
    猜你喜欢
    • 2022-01-01
    • 2022-06-28
    • 1970-01-01
    • 2022-08-22
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多