将 R 代码中的列范围概括为未知列数

Generalize column-range in R code for unknown number of column

我想 运行 以通用方式编写此代码。我的 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)))])))

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

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

试试这个

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

终于想到解决问题的办法了。我必须使用 library(dplyr) 然后代码是:

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