【问题标题】:Selecting columns where only one item is true选择只有一项为真的列
【发布时间】: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


【解决方案1】:

这里有 2 个选项:

setDT(biobank_nsaid)[, ischemia1 := 
    rowSums(is.na(.SD))==ncol(.SD)-1L & rowSums(.SD==1140909674, na.rm=TRUE)==1L, 
    .SDcols=med0:med3]

或者经过一些布尔操作:

biobank_nsaid[, ic2 := 
    !(rowSums(is.na(.SD))!=ncol(.SD)-1L | rowSums(.SD==1140909674, na.rm=TRUE)!=1L), 
    .SDcols=med0:med3]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2019-12-06
    • 1970-01-01
    相关资源
    最近更新 更多