【问题标题】:Add column to data frame based on values of another column in another row根据另一行中另一列的值将列添加到数据框中
【发布时间】:2016-05-19 14:23:52
【问题描述】:

我正在寻找特定问题的答案,但没有找到结论。我发现了这个:Add column to Data Frame based on values of other columns,但这并不是我在特定情况下所需要的。 我真的是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 应该从列 answer 中获取值(在本例中为“5”)并将其放入新列“1.partneranswer”中,但在第 125 人的行中。 我希望有人能理解我想做什么......

我的问题是我可以想象如何为每一行写这个,但我认为需要一种简单的方法来一次为所有行写这个? (特别是因为在我的原始 data.frame 中,每人有 5 个合作伙伴,并且应该从不止一列传输值,因此为每只手的每一行编写它会花费很多时间)。

我希望有人可以提供帮助。 谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    一种解决方案是使用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
    

    【讨论】:

    • 哇,非常感谢您的快速回复!它与 df$partneranswer
    【解决方案2】:

    更新:这可以通过自加入来完成;前两列定义了从 ID 到答案的映射关系,为了找到合作伙伴 ID 的答案,您可以将数据框与自身合并,第一个数据框以partnerID 为键,第二个数据框以@987654322 为键@:

    假设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
    

    【讨论】:

    • 感谢您的快速回复! ID 和 partnerID 没有映射在一起,老实说,我什至不知道这是如何工作的。但我在 Gopala 的帖子中找到了解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    相关资源
    最近更新 更多