【发布时间】:2014-09-25 15:15:20
【问题描述】:
我的问题与this one 类似,只是有点不同。在最初的问题中,我试图计算(对于每一行)有多少列满足条件。我想做类似的事情,除了条件涉及带有 OR 条件的几列,而我的真实数据有很多列,所以理想情况下,我想使用正则表达式引用这些列。
我有以下数据:
colnames <- c(paste("col",rep(LETTERS[1:2],each=4),rep(1:4,2),sep=""),c("meh","muh"))
df <- as.data.frame(matrix(sample(c("Yes","No"),200,replace=TRUE),ncol=10))
names(df) <- colnames
df
colA1 colA2 colA3 colA4 colB1 colB2 colB3 colB4 meh muh
1 No Yes No No No Yes Yes No Yes Yes
2 No Yes Yes Yes Yes No Yes No No No
3 No No No Yes No No No No Yes No
4 Yes No Yes Yes Yes Yes Yes Yes No Yes
5 Yes No Yes No No No No Yes No Yes
6 Yes No No No Yes Yes No No No No
7 Yes No No No Yes Yes Yes No Yes No
8 Yes No Yes No Yes Yes No Yes Yes No
9 No Yes No No No Yes Yes No No No
10 Yes Yes No No Yes No Yes No Yes No
11 No Yes No No Yes No Yes Yes No No
12 No Yes Yes Yes No No Yes No No No
13 No No Yes Yes No Yes Yes Yes Yes No
14 Yes Yes No No No No Yes No No Yes
15 Yes No Yes Yes No Yes No Yes No No
16 No Yes Yes No No No Yes No No No
17 Yes No No No No Yes Yes Yes No Yes
18 Yes No Yes Yes No No No No No Yes
19 No No No No No Yes No No No Yes
20 No Yes No No Yes Yes Yes No No No
我想创建一个新列Nb,记录每一行:colA2、colA3、colA4 中至少一个为 =="Yes" 的次数加上 colB2 中至少一个的次数, colB3,colB4 为 =="Yes"。
如果在查看一组列 [colA2, colA3,colA4] 时没有暗示这个“或”条件,并且我正在添加满足条件的列数,我可以使用类似的东西:
df$Nb <- rowSums(df[, grep("^col[A-B][2-4]", names(df))] == "Yes")
如果可能,我想使用正则表达式来引用列,因为在我的真实数据中,字母和数字分别比 B 和 5 更远。
谢谢!
【问题讨论】:
-
你能改变
grep中的变量吗?grep('^col[A-N][2-30], names(df))? -
您真的应该将那些“是”/“否”值转换为逻辑值 (
TRUE/FALSE)。 -
@maloneypatr 我可以,但是我写的表达式无法实现我想要的;相反,它只会计算 == "Yes" 的列数。
-
@Roland 这是个好主意。我正在使用
df[, grep("^col[A-B][2-4]", names(df))] <- (df[, grep("^col[A-B][2-4]", names(df))] == "Yes")进行操作。是否有效(足够)? -
@Peutch 是的,这很有效。但是为什么不对所有列都这样做呢?
标签: regex r dataframe conditional-statements