如何在R中遍历data.table中的列

如何在R中遍历data.table中的列,r,dataframe,data.table,R,Dataframe,Data.table,这个问题困扰了我整个周末。我想根据另一列的组计算列中“1”的数量。我想循环浏览许多列,我在这里给出的示例只是一个简单的例子。我认为DT1和DT2应该给出相同的结果,但显然DT1不起作用。有人能告诉我这是什么原因吗?谢谢大家! DT <- data.table(Sample.name = c("A","B","C","A","A","B"), Class1 = c(1, 0, 1, 0, 1, 0), Class2 = c(

这个问题困扰了我整个周末。我想根据另一列的组计算列中“1”的数量。我想循环浏览许多列,我在这里给出的示例只是一个简单的例子。我认为DT1和DT2应该给出相同的结果,但显然DT1不起作用。有人能告诉我这是什么原因吗?谢谢大家!

DT <- data.table(Sample.name = c("A","B","C","A","A","B"),
                 Class1 = c(1, 0, 1, 0, 1, 0),
                 Class2 = c(1, 1, 1, 0, 1, 1))

round.test <- colnames(DT)
round.test <- round.test[c(2, 3)]
round.test <- noquote(round.test)


DT1 <- DT[, sum((round.test[1]) == 1),
                  by = Sample.name]

DT2 <- DT[, sum(Class1 == 1),
          by = Sample.name]

DT从列名的字符向量开始,可以使用
get
获得列值:

round.test <- colnames(DT)
round.test <- round.test[c(2, 3)]

DT[, sum(get(round.test[1]) == 1), .(Sample.name)]

#   Sample.name V1
#1:           A  2
#2:           B  0
#3:           C  1

DT[, lapply(round.test, function(col) sum(get(col) == 1)), .(Sample.name)]

#   Sample.name V1 V2
#1:           A  2  2
#2:           B  0  2
#3:           C  1  1

“我想在许多列中循环”——请参见
?melt
,如
melt(DT,id=“Sample.name”)[value==1,table(Sample.name,variable)]
或类似内容。
DT[, lapply(.SD, function(col) sum(col == 1)), by=.(Sample.name), .SDcols=round.test]

#   Sample.name Class1 Class2
#1:           A      2      2
#2:           B      0      2
#3:           C      1      1