【问题标题】:Creating a new column that is an average of non-adjacent rows in the data frame创建一个新列,该列是数据框中不相邻行的平均值
【发布时间】:2019-06-26 20:12:02
【问题描述】:

我对 R 很陌生。我有多个变量列与问卷中的不同问题回答相关。我希望在数据框中生成一个新列,它是一组这些先前变量的平均值。我已经看到 rowMeans 可以用于此,但这似乎只适用于相邻的列,但我想要平均的列不相邻。我还想控制丢失数据的处理方式。我使用

创建了示例数据
Var1<- c(1.5, 2.3, NA, NA, 2.3, 3.3)
Var2<- c(1.7, 2.2, 4.7, 13.3, 1.7, 1.5)
Var3<- c(5.1, 6.7, 3.4, 5.5, NA, 8.7)
Var4<- c(4.5, 5.4, NA, 4.5, 5.4, 8.9)

这给了

  Var1 Var2 Var3 Var4
1  1.5  1.7  5.1  4.5
2  2.3  2.2  6.7  5.4
3  NA   4.7  3.4  NA
4  NA   13.3  5.5  4.5
5  2.3  1.7  NA  5.4
6  3.3  1.5  8.7  8.9

所以我想在这个数据框中创建一个新列或变量,它是 Var1、Var2 和 Var4(但不是 Var3)的平均值。如果其中一个变量的数据丢失,我还希望它仍然产生剩余数据的平均值,但是如果其中两列的数据丢失,我希望它在新列中返回 NA 。因此,对于第 3 个人,新列将为 NA,但对于第 4 和第 5 个人,将生成三列中可用值的平均值。

我希望这是有道理的,非常感谢任何帮助

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用rowSums 通过子集数据集来检查所选列的NAs 的数量。如果大于 1,则返回 NA,否则返回 1。然后,使用rowMeans 获取所选列的行的mean,并将那些大于 1 的行更改为 NA

    # column index 
    ind <- c(1, 2, 4)    
    i1 <- NA^(rowSums(is.na(df1[ind])) > 1)
    df1$newCol <- rowMeans(df1[ind], na.rm = TRUE) * i1
    

    数据

    df1 <- data.frame(Var1, Var2, Var3, Var4)
    

    【讨论】:

      【解决方案2】:

      给定..

      df1 <- data.frame(Var1, Var2, Var3, Var4)
      

      单线解决方案是..

      df1$newCol <- apply(df1[,-3],1,function(x){ifelse(sum(is.na(x))>1,NA,mean(x,na.rm=T))})
      

      【讨论】:

        猜你喜欢
        • 2021-06-28
        • 2021-04-16
        • 1970-01-01
        • 1970-01-01
        • 2016-11-14
        • 2022-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多