【发布时间】:2016-09-30 22:38:10
【问题描述】:
如果我使用这个简单的 data.table(一列)
mydata <- data.table(A=c("ID123", "ID22", "AAA", NA))
我可以找到以“ID”开头的行的位置
grep("^ID", mydata[,A])
如何改用数字来获得相同的结果? (说我想要第一列)。
我试过了
grep("^ID", mydata[,1, with=F])
但它不起作用。
更重要的是,我想以data.table的方式来做,在括号内引入命令。
mydata[,grep("^ID",.SD), .SDcols=1]
但这不起作用。
我找到了这种方式,但是太复杂了
mydata[,lapply(.SD, grep,pattern="ID"), .SDcols=1]
正确的方法是什么?
稍微复杂一点:
如果我想同时计算有多少行不是 NA 并以“ID”开头怎么办?
有点像
any(!(grepl("^ID", mydata[,A] ) | is.na(mydata[,A])))
但更紧凑且位于括号内。
我不喜欢 grep 将 NA 视为不匹配而不是输出 NA 的事实。
【问题讨论】:
-
我找到了这种方式,但是太复杂了 mydata[,lapply(.SD, grep,pattern="ID"), .SDcols=1]
-
FAQ 中的第一个答案解释了为什么“按数字而不是名称来引用列通常是不好的做法”rawgit.com/wiki/Rdatatable/data.table/vignettes/… 一种计算行数的方法是
mydata[ A %like% "^ID" | is.na(A), .N ]--%like%是只是一个方便的快捷方式grepl。顺便说一句,如果您的示例包含 NA,可能会更好。 -
我更改了问题标题,以便更准确地总结请求。
-
我知道使用列号可能很危险,因为它们可能会按时更改。但有时您需要使用它们一次引用多个列,或者因为这些数字来自之前的过滤。
-
我刚刚发现,只要参数为 NA,grepl 就会产生 FALSE。然后我们不需要添加 is.na() 检查。这取决于我们想要什么。
标签: r data.table