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中解决这个问题?
答案 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)