如果任何所选变量包含 data.table 中的给定字符串,则创建变量 1
Create variable that is 1 if any of chosen variables contain given string in data.table
如果在 data.table.
中任何所选变量以给定字符串(示例中的 "A")开头,我想创建变量 1
一个用玩具数据来说明问题的例子:
library(data.table)
DT=as.data.table(matrix(c(LETTERS[seq( from = 1, to = 9 )],rep("A",3)), nrow=3, ncol=4))
我的尝试是在 data.table := 命令中的 apply 中使用 grepl(最大选择 "if any" 方面)来编写新变量。类似于:
DT[,letterA:= max(apply(.SD,2,grepl,pattern= "^A" )), .SDcols=c("V1","V2")]
但是如果数据中有 A,这会将 1 分配给所有观察值,我知道这是不正确的,因为应用将提供一个向量。此外,"max" 的做法似乎很混乱。我怎么说"if any of these columns starts with A then make the variable letterA a 1 and 0 otherwise"?
试试这个:
DT[,letterA:=Reduce("|",lapply(.SD,grepl,pattern= "^A" )),
.SDcols=c("V1","V2")]
# V1 V2 V3 V4 letterA
#1: A D G A TRUE
#2: B E H A FALSE
#3: C F I A FALSE
如果在 data.table.
中任何所选变量以给定字符串(示例中的 "A")开头,我想创建变量 1一个用玩具数据来说明问题的例子:
library(data.table)
DT=as.data.table(matrix(c(LETTERS[seq( from = 1, to = 9 )],rep("A",3)), nrow=3, ncol=4))
我的尝试是在 data.table := 命令中的 apply 中使用 grepl(最大选择 "if any" 方面)来编写新变量。类似于:
DT[,letterA:= max(apply(.SD,2,grepl,pattern= "^A" )), .SDcols=c("V1","V2")]
但是如果数据中有 A,这会将 1 分配给所有观察值,我知道这是不正确的,因为应用将提供一个向量。此外,"max" 的做法似乎很混乱。我怎么说"if any of these columns starts with A then make the variable letterA a 1 and 0 otherwise"?
试试这个:
DT[,letterA:=Reduce("|",lapply(.SD,grepl,pattern= "^A" )),
.SDcols=c("V1","V2")]
# V1 V2 V3 V4 letterA
#1: A D G A TRUE
#2: B E H A FALSE
#3: C F I A FALSE