我正试图在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
然而,我正在处理一个大型数据集(>4000万(,并且还想根据icpc
和icpc2
中的字母进行分类。
我的目标是在列icpc
或icpc2
中有一个字母A
(即A01
、A04
、A50
等(的情况下添加一个新列,该列给出yes
或no
。我还希望具有相同id
的所有列在新列condit2
中具有yes
我正在尝试以下内容:
df2 <- setDT(df)[, condit2 := ifelse
(any(icpc %in% pmatch("K", df) | icpc2 %in% pmatch("K", df)), "yes","no"), by = PATNR]
head(df2)
它一直在运行。。。(我想,无论如何,df都太面包了,如果应该是df$icpc
和df$icpc2
?(
然后检查pmatch
是否合适:
condit2 <- pmatch("K")
然后看了一个完全不同的东西:
library(sqldf)
condit2 <- sqldf("df$icpc | df$icpc2, '%K%'")
这将导致以下数据帧:
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
有人能给个提示吗?谢谢
setDT(df)
to_check <- 'A'
df[, condit2 := fifelse(any(grepl(to_check, icpc) | grepl(to_check, icpc2)),
'yes', 'no'),
by = id]
df
# 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
如果不是只有两列icpc
和icpc2
,而是有一堆它们,并且不想为每一列都键入grepl
代码,那么这里的.SDcols
版本会给出相同的结果。
df[, condit2 := fifelse(any(Reduce('|', lapply(.SD, grepl, patt = to_check))),
'yes', 'no'),
by = id, .SDcols = patterns('icpc')]
对于dplyr
,可以使用以下方法完成:group_by(id)
、paste
将感兴趣的两列放在一起,并使用sum
和grepl
检查连接字符串中是否出现至少一个A
。
library(dplyr)
df %>%
group_by(id) %>%
mutate(condit2 = case_when(sum(grep("A", paste(icpc, icpc2))) > 0 ~ "yes",
TRUE ~ "no")) %>%
ungroup()
id icpc icpc2 reg.date condit2
<int> <chr> <chr> <chr> <chr>
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