1

df

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

ETC

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

我需要通过 App2,如果 App2 上的值与应用程序中括号之间的值匹配,则需要将 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 中解决这个问题?

4

2 回答 2

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, ")"),也可以替换sapplyvapply和预期的输出:integer(1).

编辑:

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

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

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

于 2012-11-23T15:26:07.403 回答
1

弗洛德尔的更优雅,但这可能有助于理解这些步骤。

> 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)
于 2012-11-23T15:49:11.357 回答