R 基于多个列和条件更新data.table

R 基于多个列和条件更新data.table,r,data.table,R,Data.table,这是我们的后续问题 样本数据 我有一个data.table,有5个p列,表示一种类型(type1或type2或NA)。 我还有5个r列,表示分数(1-10,或NA) 库(data.table) 种子集(123) v这里有一个解决方案,我将类型列转换成一个矩阵,用r列中的信息更新它们,然后在上面应用,搜索相关类型的次数与要查找的类型的次数相同 # Convert to a matrix pMAT <- DT[, as.matrix(.SD), .SDcols = patterns("^p")

这是我们的后续问题

样本数据
我有一个data.table,有5个p列,表示一种类型(type1或type2或
NA
)。 我还有5个r列,表示分数(1-10,或
NA

库(data.table)
种子集(123)

v这里有一个解决方案,我将类型列转换成一个矩阵,用
r
列中的信息更新它们,然后在上面应用,搜索相关类型的次数与要查找的类型的次数相同

# Convert to a matrix
pMAT <- DT[, as.matrix(.SD), .SDcols = patterns("^p")]
# Subset a matrix with another matrix of the r columns
pMAT[] <- pMAT[DT[, as.logical(as.matrix(.SD)), .SDcols = patterns("^r")]]

types2check <- c("type1", "type2")
for (t in types2check) {
  set(
    x = DT, 
    j = paste0(t, "_present"), 
    value = ifelse(apply(pMAT, 1, function(x) any(x == t, na.rm = TRUE)), "yes", "no")
  )
}

这里有一个解决方案,我将类型列转换成矩阵,用
r
列中的信息更新它们,然后在上面应用,搜索相关类型的次数与要查找的类型的次数相同

# Convert to a matrix
pMAT <- DT[, as.matrix(.SD), .SDcols = patterns("^p")]
# Subset a matrix with another matrix of the r columns
pMAT[] <- pMAT[DT[, as.logical(as.matrix(.SD)), .SDcols = patterns("^r")]]

types2check <- c("type1", "type2")
for (t in types2check) {
  set(
    x = DT, 
    j = paste0(t, "_present"), 
    value = ifelse(apply(pMAT, 1, function(x) any(x == t, na.rm = TRUE)), "yes", "no")
  )
}

我确信在广泛的格式中有一些技巧可以做到这一点,但我倾向于认为使用长格式的数据更容易。类似这样的方法似乎很管用:
d您可能会发现它很有用。我相信在广泛的格式中有一些技巧可以做到这一点,但我倾向于认为使用长格式的数据更容易。类似这样的方法似乎有效:
d您可能会发现有用
#build vectors p-columns and r-columns
p_cols <- grep( "^p", names( DT ), value = TRUE )
r_cols <- grep( "^r", names( DT ), value = TRUE )

#create logical vectors to test for NA
logi_p <- as.data.table( sapply( DT[, ..p_cols ], function(x) !is.na(x) ) )
logi_r <- as.data.table( sapply( DT[, ..r_cols ], function(x) !is.na(x) ) )

#which non-NA p-values also have a non-NA r-value?
logi <- as.data.table( sapply( logi_p * logi_r, as.logical ) )
# Convert to a matrix
pMAT <- DT[, as.matrix(.SD), .SDcols = patterns("^p")]
# Subset a matrix with another matrix of the r columns
pMAT[] <- pMAT[DT[, as.logical(as.matrix(.SD)), .SDcols = patterns("^r")]]

types2check <- c("type1", "type2")
for (t in types2check) {
  set(
    x = DT, 
    j = paste0(t, "_present"), 
    value = ifelse(apply(pMAT, 1, function(x) any(x == t, na.rm = TRUE)), "yes", "no")
  )
}
result <- data.table(id = DT[["id"]], stack(DT[, ..pcols]), stack(DT[, ..rcols])) %>%
  setnames(c("id", "type", "pind", "rval", "rind")) %>% 
  .[, .(type = type[as.logical(rval)], id)] %>% 
  dcast(id ~ type, value.var = "id", fill = "no", fun.aggregate = function(x) if (length(x)) "yes") %>% 
  .[, `NA` := NULL]

> head(result)
   id type1 type2
1:  1   yes   yes
2:  2   yes    no
3:  3    no   yes
4:  4    no    no
5:  5    no   yes
6:  6   yes    no