对于未知的列数,在R代码中概括列范围

时间:2019-06-14 14:10:34

标签: r calculated-columns

我想以通用方式运行此代码。在我的df中,从12到25的列中有TN类型变量。我想保留所有数据,并按新变量sumTN中的行计算TN类型变量的有效chr类型值的总和。在这些变量中缺少数据的地方,我没有NA。

df$sumTN <- as.vector(rowSums(!is.na(df[, c(12:25)])))

我想将这些代码用于其他数据集,其中TN类型变量(我希望按行将它们求和)可以位于不同范围的不同列中。

我尝试了两种不同的方法来获得此结果,但是在两种情况下,我都收到一条消息,即“'x'必须是至少二维的数组”。我知道为什么,但是我不知道该如何解决这个问题。这是我尝试过的代码:

firstcol = which(colnames(df)=="TN_1")
lastcol = which(colnames(df)=="TN_14")
df$sumTN <- as.vector(rowSums(!is.na(df[, c(firstcol:lastcol)])))

df$sumTN <- as.vector(rowSums(!is.na(df[, c(grep("^TN_[0-9]+$", colnames(df)))])))

任何解决方案将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:0)

这就是我的想法。该代码看起来不错,但对于某些数据框,它必须返回单个列。这些被转换为向量。您可以使用drop=FALSE来抑制此行为。另外,在isna数据框上进行子设置。

尝试

rowSums( (!is.na(df))[, c(grep("^TN_[0-9]+$", colnames(df))), drop=FALSE] )

答案 1 :(得分:0)

最后,我找到了解决问题的方法。我必须使用library(dplyr),然后代码是:

df$sumTN <- as.vector(rowSums(!is.na(select_if(df, grepl("^TN_[0-9]+$", colnames(df))==T))))