簡體   English   中英

根據另一行中另一列的值將列添加到數據框

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM