根据另一列搜索R中的df列

时间:2012-11-23 15:12:28

标签: r

DF

App1             App2
PS(id-123)       id-345
HR(id-345)       id-789
Web(id-567)      id-123
Trading(id-789)  id-345

数据框中的列未排序,或者可能或可能不匹配相同的行值。例如,在第一行,PS(id-123)与id-345不匹配。 App1和App2上的值可自由输入。

我需要使用app2,如果App2上的值与Apps中的Parentheis之间的值匹配,则需要将App2中的值替换为App1中的值。

这是我最终的df应该是这样的:

App1             App2      App3
PS(id-123)       id-345    HR(id-345)
HR(id-345)       id-789    Trading(id-789)
Web(id-567)      id-123    PS(id-123)
Trading(id-789)  id-345    HR(id-345)

根据Apps2中的值搜索App1,如果匹配则将值放在App3列中?

任何想法如何在R中解决这个问题?

2 个答案:

答案 0 :(得分:6)

这很简短,适用于您当前的数据:

transform(df, App3 = App1[sapply(App2, grep, App1)])
#              App1   App2            App3
# 1      PS(id-123) id-345      HR(id-345)
# 2      HR(id-345) id-789 Trading(id-789)
# 3     Web(id-567) id-123      PS(id-123)
# 4 Trading(id-789) id-345      HR(id-345)

为了使其更加健壮,您可以将上面的App2替换为paste0("(", App2, ")"),同时将sapply替换为vapply和预期的输出:integer(1)

修改

由于某些ID似乎没有匹配,因此基于match的方法可能更合适:

transform(df, App3 = App1[match(App2, sub(".*\\((id-.+)\\)", "\\1", App1))])

其中sub(".*\\((id-.+)\\)", "\\1", App1)用于从App1列中提取有趣的信息。

答案 1 :(得分:1)

flodel's更优雅,但这可能有助于理解这些步骤。

> idx <- sapply(dat$App2, function(x) grep(x, dat$App1) )
> dat$App3b <- dat$App1[idx]
> dat
             App1   App2            App3           App3b
1      PS(id-123) id-345      HR(id-345)      HR(id-345)
2      HR(id-345) id-789 Trading(id-789) Trading(id-789)
3     Web(id-567) id-123      PS(id-123)      PS(id-123)
4 Trading(id-789) id-345      HR(id-345)      HR(id-345)