【发布时间】:2020-08-20 02:35:22
【问题描述】:
我正在使用以下代码来确定我的数据表中的任何列是否有 1065。如果任何列确实有 1065,我会得到“TRUE”,它工作得很好。现在我只想在任何列 notcancer0:notcancer33 包含 1065 并且所有其他列都是 NA 时输出 true。其他列可能包含其他值,如 1064、1066 等。但我想为只有 1065 的行输出“TRUE”,而所有其余列都包含该行的 NA。做这个的最好方式是什么?
biobank_nsaid[, ischemia1 := Reduce(`|`, lapply(.SD, `==`, "1065")), .SDcols=notcancer0:notcancer33]
样本数据:
biobank_nsaid = structure(list(aspirin = structure(c(2L, 1L, 1L, 1L), .Label =
c("FALSE", "TRUE"), class = "factor"), aspirinonly = c(TRUE, FALSE, FALSE,
FALSE), med0 = c(1140922174L, 1140871050L, 1140879616L, 1140909674L ), med1 =
c(1140868226L, 1140876592L, 1140869180L, NA), med2 = c(1140879464L, NA,
1140865016L, NA), med3 = c(1140879428L, NA, NA, NA)), row.names = c(NA, -4L),
class = c("data.table", "data.frame"))
【问题讨论】:
-
听起来你想要一个 XOR 运算符,R 有
xor()。将代码中的`|`更改为xor。您可能还想将`==`更改为%in%... 否则我认为您还需要在某处申请is.na。如果您的列是数字,我建议删除 1065 左右的引号。 -
您好 Gregor,感谢您的回复。我运行了代码,得到的结果与我使用 | 时的结果相同。操作员。例如:
biobank_nsaid[, aspirin := Reduce(`|`, lapply(.SD, `==`, "1140868226")), .SDcols=med0:med47]与biobank_nsaid[, aspirinonly := Reduce(`xor`, lapply(.SD, `%in%`, "1140868226")), .SDcols=med0:med47]让我得到阿司匹林 aspirinonly med0 med1 med2 med3 1:TRUE TRUE 1140922174 1140868226 1140879464 1140879428
标签: r data.table lapply