我有脑痉挛。以下是玩具数据集:
df <- data.frame(
id = 1:6,
v1 = c("a", "a", "c", NA, "g", "h"),
v2 = c("z", "y", "a", NA, "a", "g"),
stringsAsFactors=F)
我有一个特定的值,我希望在一组定义的列中找到它,我想确定它所在的位置。我正在搜索的字段是字符,诀窍是我正在寻找的值可能不存在。此外,数据集中也存在空字符串。
假设我知道如何做,变量 position 表示我想要返回的值。
> df
id v1 v2 position
1 1 a z 1
2 2 a y 1
3 3 c a 2
4 4 <NA> <NA> 99
5 5 g a 2
6 6 h g 99
一般规则是我想找到值“a”的位置,如果找不到或者v1缺失,那么我想要99返回。
在这个例子中,我正在搜索v1和v2,但实际上,我有10个不同的变量。值得注意的是,我搜索的值只能在10个变量中存在一次。
生成此重新编码的最佳方法是什么?
非常感谢提前。
答案 0 :(得分:10)
使用match
:
> df$position <- apply(df,1,function(x) match('a',x[-1], nomatch=99 ))
> df
id v1 v2 position
1 1 a z 1
2 2 a y 1
3 3 c a 2
4 4 <NA> <NA> 99
5 5 g a 2
6 6 h g 99
答案 1 :(得分:1)
首先,删除第一列:
df <- df[, -1]
然后,做这样的事情(免责声明:我感到非常困倦 * ):
( df$result <- unlist(lapply(apply(df, 1, grep, pattern = "a"), function(x) ifelse(length(x) == 0, 99, x))) )
v1 v2 result
1 a z 1
2 a y 1
3 c a 2
4 <NA> <NA> 99
5 g a 2
6 h g 99
* 困 =代码未向量化
编辑(稍微不同的解决方案,我仍然感到困倦):
df$result <- rapply(apply(df, 1, grep, pattern = "a"), function(x) ifelse(length(x) == 0, 99, x))