基于列R中的部分匹配创建新变量

问题描述 投票:1回答:2

我正在尝试根据类似于以下数据的东西在data.frame中创建一个新变量:

df <- structure(list(id = c(123L, 123L, 332L, 332L, 332L, 100L, 100L, 
113L, 113L, 113L, 113L, 551L, 551L), icpc = c("D95", "F85", "A01", 
"A04", "K20", "B10", "A04", "T08", "P28", "D95", "A04", "B12", 
"D95"), icpc2 = c("F15", "", "", "", "", "", "", "", "", "A01", 
"", "A01", ""), reg.date = c("19JUN2015", "15AUG2016", "16MAR2010", 
"20JAN2018", "20FEB2017", "01JUN2017", "11JAN2008", "18MAR2018", 
"19JAN2017", "16JAN2013", "01MAY2009", "03APR2011", "09MAY2015"
)), class = "data.frame", row.names = c(NA, -13L))

我已使用以下代码管理新列condit

library(data.table)

cond1 <- c("D95", "A01")
setDT(df)[, condit := ifelse(any(icpc %in% cond1 | icpc2 %in% cond1), "yes","no"), by=id]
df

但是,我正在使用大型数据集(> 40 milion),并且还想基于icpcicpc2中的字母进行分类。

我的目标是添加一个新列,该列将yesno赋予字母A(因此,A01A04A50等)[ C0]或icpc。我还希望所有具有相同icpc2的列在新列id中都具有yes

我正在尝试以下操作:

condit2

这一直持续运行...(我想,df太面包了,如果应该是df2 <- setDT(df)[, condit2 := ifelse (any(icpc %in% pmatch("K", df) | icpc2 %in% pmatch("K", df)), "yes","no"), by = PATNR] head(df2) df$icpc?]

比以下内容检查df$icpc2是否合适:

pmatch

然后看了一些完全不同的东西:

condit2 <- pmatch("K")

这将导致以下数据帧:

library(sqldf)
condit2 <- sqldf("df$icpc | df$icpc2, '%K%'")

任何人都可以提供提示吗?谢谢!!

我正在尝试根据类似于以下数据的东西在data.frame中创建一个新变量:df

r if-statement data.table bigdata
2个回答
3
投票
    id  icpc icpc2 reg.date    condit2
 1: 123  D95   F15 19JUN2015    no
 2: 123  F85       15AUG2016    no
 3: 332  A01       16MAR2010    yes
 4: 332  A04       20JAN2018    yes
 5: 332  K20       20FEB2017    yes
 6: 100  B10       01JUN2017    yes
 7: 100  A04       11JAN2008    yes
 8: 113  T08       18MAR2018    yes
 9: 113  P28       19JAN2017    yes
10: 113  D95   A01 16JAN2013    yes
11: 113  A04       01MAY2009    yes
12: 551  B12   A01 03APR2011    yes
13: 551  D95       09MAY2015    yes

2
投票

使用df[, condit2 := fifelse(any(Reduce('|', lapply(.SD, grepl, patt = to_check))), 'yes', 'no'), by = id, .SDcols = patterns('icpc')] ,可以通过以下方法完成:dplyrgroup_by(id)一起关注两列,并使用pasteA检查在连接的字符串中是否至少有一个sum

grepl
© www.soinside.com 2019 - 2024. All rights reserved.