【发布时间】:2017-10-31 02:18:00
【问题描述】:
我的数据框如下
df <- data.frame(c("Utility grid", "Grid connection", "Grid", "", "", "Dry-cell-torch", "Solar", ""), c("solar", "", "", "", "", "", "Dry-cell-torch", ""), c("", "fan", "TV", "", "Utility grid connection", "", "", "Unreachable"), c("", "radio", "", "", "", "", "", ""))
colnames(df) <- c(paste("de_", 1:4, sep=""))
我想在此数据框中添加第 5 列“de”,条件如下 -
条件1.如果所有行都为空如第4行,“de”应为0。
条件 2。如果 4 行中只有一个非空白,并且该值要么是“包含”“网格”而不区分大小写,要么是“无法访问”,或者是“干电池火炬” ",那么 "de" 应该是 0。
条件3。否则“de”应为1
所需的“de”应该是
df$de <- (c(1, 1, 1, 0, 0, 0, 1, 0))
请注意我的原始数据框是 600 行和 45 列。我只是在这里放一个子集,但这个子集说明了我想要完成的详尽条件。
所以我使用 grepl 尝试了以下正则表达式(改编自你们中的一个在 stackoverflow 上给出的解决方案,在一个不同但类似的问题中)-
df$de <- (!grepl("grid|Unreachable|Dry-cell-torch|^$",
apply(df,1,paste, collapse=""), ignore.case=TRUE))+0L
这有效,除非在第 1 行中说,在 1 列中我有“公用事业网格”,而在第二列中我有“太阳能”,它给我 de 为 0 而我需要 1。我理解问题 - 如果存在网格、无法访问等之一,则应与同一行中所有其他单元格的“和”条件相结合,但我无法弄清楚如何实现这一点
感谢您的帮助!
【问题讨论】:
-
你说了很多行而不是列,你能清理你的问题吗?
-
我对您在条件 2 中寻找的内容感到困惑。如果您正在检查 4 列中的任何一列是否有值,然后检查这些值是否为“无法访问”或“干电池火炬”或包含“网格”。那么对于您的示例,每个 de 值都是 0。
-
穆迪,那是因为我打算将它作为行而不是列。所以我希望 R 代码遍历 4 列中的每一行,并检查列出的 3 个条件,并相应地为 de 赋值。马特,在条件 2 中,如果任何列是“无法到达”或“干电池火炬”或包含“网格”,并且如果列除了这些值之外还有非空白值,则 de 应为 1,否则 de应该是 0。