r - 根据 R 列中的部分匹配创建新变量
问题描述
我正在尝试根据以下数据在 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
。
我的目标是添加一个新列,该列给出或表示在yes
任no
一列或. 我还希望所有具有相同内容的列都包含在新列中。A
A01
A04
A50
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
谁能给个提示?谢谢!!
解决方案
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
and icpc2
,您有一堆并且不想grepl
为每个列都输入代码,那么这里的版本.SDcols
给出了相同的结果。
df[, condit2 := fifelse(any(Reduce('|', lapply(.SD, grepl, patt = to_check))),
'yes', 'no'),
by = id, .SDcols = patterns('icpc')]
推荐阅读
- reactjs - 将 react-router 从 2.x 升级到 5.x 后找不到 React-Router applyRouterMiddleware 功能
- ios - SwiftUI:当用户在第一个 ScrollView 中点击该项目时,在特定索引处加载第二个 ScrollView
- nlp - 为什么在 python 中导入 NLTK 会出错
- swiftui - 如何在 macOS 上限制 SwiftUI Picker 的高度
- javascript - 单击所选选项的特定区域时,如何防止打开material-ui Select选项
- python - 我正在为基于文本的 RPG 编写代码,并且在解析时收到 SyntaxError: unexpected EOF。我该如何解决这个问题?
- rust - 如果文件不包含有效的 UTF-8,我如何获取文件的内容
- sql - 使用 DAX 基于多对多关系映射值
- unix - 在一个 PID 下运行一组命令
- xamarin.forms - 无法使用 itms url 在 iPhone 中安装 ipa