【问题标题】:For Loop over data frame, using dplyr results in error对于循环数据帧,使用 dplyr 会导致错误
【发布时间】:2020-11-24 15:57:52
【问题描述】:

我有一个简化的包含 71 列和 N 行的数据框。我想要得到的是基于所有其他列的第一列中的值的频率表(所有其他列都有假人)。简化(只有 4 列)这将是这样的:

df <- data.frame(sample(1:8,20,replace=T),sample(0:1,20,replace = T),sample(0:1,20,replace = T),sample(0:1,20,replace = T))

我已经用 dplyr 尝试了这个 for 循环(其中 x 是具有 8 个不同值的第一列),它只适用于前 10 或 11 列没有问题,但之后它只生成 NA 并返回错误:

freq_df <- data.frame(matrix(NA, nrow=8, ncol=71))
for (i in 2:71){
  freq_df[,i] <- df %>%
    filter(df[i]==1) %>%
    count(x) %>%
    select(n)
}       

in `[<-.data.frame`(`*tmp*`, , i, value = list(n = c(3L, 5L, 8L,  : 
  replacement element 1 has 7 rows, need 8

有人知道为什么 R 会返回这个错误吗?感谢您的帮助!

【问题讨论】:

    标签: r for-loop dplyr


    【解决方案1】:

    您的错误是因为并非所有第一列值都会出现在其他列为 1 的情况下。第一列中有 8 个唯一值,当您在第 11 列过滤时可能有 7 个 == 1。所以结果可以有长度不同,这是个问题。

    试试这个,我认为这是你想要做的。 (如果没有,请通过显示预期输出来阐明您的目标。)

    names(df) = paste0("V", 1:4)
    df %>%
      group_by(V1) %>%
      summarize(across(everything(), sum, .names = "{.col}_count"))
    #      V1 V2_count V3_count V4_count
    #   <int>    <int>    <int>    <int>
    # 1     1        1        0        1
    # 2     2        2        1        2
    # 3     3        3        3        2
    # 4     4        0        0        0
    # 5     5        0        0        0
    # 6     6        3        1        2
    # 7     7        3        1        1
    # 8     8        1        1        0
    

    【讨论】:

      【解决方案2】:

      base R,我们可以做

      names(df) <- paste0("V", 1:4)
      out <- aggregate(.~ V1, df, sum, na.rm = TRUE)
      names(out)[-1] <- paste0(names(out)[-1], "_count")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-11
        • 2016-10-28
        • 2017-11-30
        • 2021-12-13
        • 2017-01-09
        • 1970-01-01
        • 2020-08-01
        • 1970-01-01
        相关资源
        最近更新 更多