1

df

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

データフレームの列は順序付けられていないか、同じ行の値と一致する場合と一致しない場合があります。たとえば、1行目では、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でこれにどのようにアプローチできるかアイデアはありますか?

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))])

ここで、sub(".*\\((id-.+)\\)", "\\1", App1)は列から興味深い情報を抽出するために使用されApp1ます。

于 2012-11-23T15:26:07.403 に答える
1

flodelの方がエレガントですが、これは手順を理解するのに役立つ場合があります。

> 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 に答える