Я пытаюсь создать новую переменную в 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 миллионов) , а также хочу классифицировать на основе букв в icpc
и icpc2
.
Моя цель - добавить новый столбец, в котором yes
или no
добавляется буква A
(т. Е. A01
, A04
, A50
et c.) В столбце icpc
или icpc2
. Я также хочу, чтобы все столбцы с одинаковым id
имели yes
в новом столбце condit2
.
Я пробовал следующее:
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
Может кто-нибудь дать Намек? Спасибо !!