我一定是用了错误的搜索词来思考,因为我不敢相信我的问题是独一无二的,但我只找到了一个类似的问题。
我有一些来自世界银行的相当笨重的数据,它们是代表数据库的平面文件。数据每行一个项目,但每个项目都有多个特征,这些特征方便地位于名称为“SECTOR.1”的列中,而其自己的特征位于名称为“SECTOR.1.PCT”等的其他列中。
由此,我尝试提取与特定类型的部门相关的数据,但我仍然需要拥有所有其他项目信息。
从我在 SO 上发现的另一个问题中,我已经能够朝着正确的方向迈出一些步骤:查找数据框中包含字符串作为值的列的索引
基于上面的问题注释,一个最小的可重现示例如下:
> df <- data.frame(col1 = c(letters[1:4],"c"),
... col2 = 1:5,
... col3 = c("a","c","l","c","l"),
... col4= letters[3:7])
> df
col1 col2 col3 col4
1 a 1 a c
2 b 2 c d
3 c 3 l e
4 d 4 c f
5 c 5 l g
我想要的输出是这样的:
1 col4
2 col3
3 col1
4 col3
5 col1
我知道我可以执行 ifelse,但这似乎不是一个非常优雅的方法。当然,由于这是我只会做一次的事情(对于这个项目),所以拼写错误的风险很小。例如,
> df$hasc <- ifelse(grepl("c",df$col1), "col1",
... ifelse(grepl("c",df$col2), "col2",
... ifelse(grepl("c",df$col3), "col3",
... ifelse(grepl("c",df$col4), "col4",
... NA))))
> df
col1 col2 col3 col4 hasc
1 a 1 a c col4
2 b 2 c d col3
3 c 3 l e col1
4 d 4 c f col3
5 c 5 l g col1
我认为如果我有某种可以按行查看列的应用函数会更好。上一个问题中的方法不适用于这个问题,因为我需要知道哪一列有“c”。除了列出带有“c”的列名之外,我得到了一些没有意义的东西。我不明白 1,3,4,因为它与行名或计数不对应:
>which(apply(df, 2, function(x) any(grepl("c", x))))
col1 col3 col4
1 3 4
而且,如果我尝试按行执行此操作,我确实会看到每行都有一个“c”,正如预期的那样。
>which(apply(df, 1, function(x) any(grepl("c", x))))
[1] 1 2 3 4 5
另外->我想知道是否有一种方法可以处理这个问题,如果一行中有多个“c”,例如,如果我们有:
> df <- data.frame(col1 = c(letters[1:4],"c"),
... col2 = 1:5,
... col3 = c("a","c","l","c","c"),
... col4= letters[3:7])
> df
col1 col2 col3 col4
1 a 1 a c
2 b 2 c d
3 c 3 l e
4 d 4 c f
5 c 5 c g
我的 ifelse 方法失败了,因为它只为 row5 提供“col1”。