[英]Add column to data frame based on values of another column in another row
我正在尋找我的具體問題的答案,但我沒有找到結論。 我發現了這一點: 根據其他列的值向數據框添加列 ,但它不是我在特定情況下所需要的。 我真的是R的初學者,所以我希望也許有人可以幫助我或對我有好的暗示。
這是我的數據框的示例:
ID answer 1.partnerID
125 3 715
235 4 845
370 7 985
560 1 950
715 5 235
950 5 560
845 6 370
985 6 125
我試着在一個例子中描述我想做的事情:第一行是ID為125的人的數據。這個人的第一個伙伴是ID為715的人。我想創建一個新列,每個人的伴侶的答案的價值。 它應該如下所示:
ID answer 1.partnerID 1.partneranswer
125 3 715 5
235 4 845 6
370 7 985 6
560 1 950 5
715 5 235 4
950 5 560 1
845 6 370 7
985 6 125 3
所以R應該取列1.partnerID的值,在這種情況下是“715”並搜索該行,其中“715”是列ID中的值(沒有多於一次的ID)。 從這個特定的行R應該從列回答中獲取值(在這個例子中是“5”)並將其放入新列“1.partneranswer”,但是在人125的行中。我希望有人可以明白我想做什么......
我的問題是我可以想象如何為每一行的每一行寫這個,但我認為需要一個簡單的方法來一次為所有行做這個? (特別是因為在我原來的data.frame中,每個人有5個合作伙伴,並且有多個列應該從中傳輸值,因此每個單獨的每行寫入它會花費很多時間)。
我希望有人能幫幫忙。 謝謝!
一種解決方案是使用如下apply
:
df$partneranswer <- apply(df, 1, function(x) df$answer[df$ID == x[3]])
輸出將如上所述。 可能存在無環路方法。
編輯:使用match
添加無循環(矢量化答案):
df$partneranswer <- df$answer[match(df$X1.partnerID, df$ID)]
df
ID answer X1.partnerID partneranswer
1 125 3 715 5
2 235 4 845 6
3 370 7 985 6
4 560 1 950 5
5 715 5 235 4
6 950 5 560 1
7 845 6 370 7
8 985 6 125 3
更新 :這可以通過自聯接完成; 前兩列定義了從ID到答案的映射關系,為了找到伙伴ID的答案,您可以將數據框與自身合並,其中第一個數據幀鍵入partnerID
,第二個數據幀鍵入ID
:
假設df
是(固定列名稱一點點):
df
# ID answer partnerID
#1 125 3 715
#2 235 4 845
#3 370 7 985
#4 560 1 950
#5 715 5 235
#6 950 5 560
#7 845 6 370
#8 985 6 125
merge(df, df[c('ID', 'answer')], by.x = "partnerID", by.y = "ID")
# partnerID ID answer.x answer.y
#1 125 985 6 3
#2 235 715 5 4
#3 370 845 6 7
#4 560 950 5 1
#5 715 125 3 5
#6 845 235 4 6
#7 950 560 1 5
#8 985 370 7 6
舊答案 :如果ID和partnerID相互映射,您可以嘗試:
df$partneranswer <- with(df, answer[sapply(X1.partnerID, function(partnerID) which(ID == partnerID))])
df
# ID answer X1.partnerID partneranswer
#1 125 3 715 5
#2 235 4 845 6
#3 370 7 985 6
#4 560 1 950 5
#5 715 5 235 4
#6 950 5 560 1
#7 845 6 370 7
#8 985 6 125 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.