【问题标题】:loop to create a new variable based on other cases in R (very basic)循环根据 R 中的其他情况创建一个新变量(非常基本)
【发布时间】:2011-08-20 22:59:39
【问题描述】:

我有一个包含三个变量的数据框:IDgroupnominated_ID。 我想知道nominated_ID所属的group

我在想象,对于每一种情况,我们取nominated_ID,找到它等于ID的情况,然后将原始情况下的nominated_Group变量设置为等于group中的变量匹配的案例。 (如果没有匹配,设置为NA)

如果可以在没有循环的情况下完成此操作,我不会感到惊讶,因此我对解决方案持开放态度。非常感谢你的帮助。知道我在发帖之前确实尝试过寻找类似的问题。

【问题讨论】:

    标签: r loops vectorization data-manipulation


    【解决方案1】:

    以下似乎有效;可能有更好的方法

    > df <- data.frame(ID = c(9, 5, 2, 4, 3), 
    +                  group = c("Odd", "Odd", "Even", "Even", "Odd"),
    +                  nominated_ID = c(9, 8, 4, 9, 2)                 )
    > df
      ID group nominated_ID
    1  9   Odd            9
    2  5   Odd            8
    3  2  Even            4
    4  4  Even            9
    5  3   Odd            2
    > nominated_Group <- df[match(df$nominated_ID, df$ID), ]$group
    > newDF <- cbind(df, nominated_Group)
    > newDF
      ID group nominated_ID nominated_Group
    1  9   Odd            9             Odd
    2  5   Odd            8            <NA>
    3  2  Even            4            Even
    4  4  Even            9             Odd
    5  3   Odd            2            Even
    

    【讨论】:

    • 我不确定协议是什么(并且希望被告知),但我倾向于将其称为已解决的答案,因为它既好又是第一,同时注意和投票由@Prasad df &lt;- transform( df, nominated_group = group[match(nominated_ID, ID)]) 和@Andrie df$nominated_group &lt;- with(df, group[match(nominated_ID, ID)]) 进行的代码简化也许我可以潜入一个后续问题......我如何创建一个parent_group 变量,以便在所有提名中都发生在同一个@987654325 @?
    【解决方案2】:

    您可以使用transformmatch 和数组索引以一种语法紧凑的方式执行此操作。使用@Henry 的数据框:

    df <- transform( df, nominated_group = group[match(nominated_ID, ID)])
    
    > df
      ID group nominated_ID nominated_group
    1  9   Odd            9             Odd
    2  5   Odd            8            <NA>
    3  2  Even            4            Even
    4  4  Even            9             Odd
    5  3   Odd            2            Even
    

    【讨论】:

      【解决方案3】:

      可能不是最“直观”的方式,但如果您使用提名_ID 作为第一个副本的合并索引并将 ID 作为第二个副本的索引并保留所有行,则将 dfdf 合并也有效。您需要删除第二个nominated_ID 列并重新排列顺序以匹配上述答案:

      merge(df,df, by.x=3, by.y=1, all.x=TRUE)[order(df$nominated_ID), c(2,3, 1, 4)]
      
        ID group.x nominated_ID group.y
      5  4    Even            9     Odd
      3  5     Odd            8    <NA>
      2  2    Even            4    Even
      1  3     Odd            2    Even
      4  9     Odd            9     Odd
      

      【讨论】:

        【解决方案4】:

        您可以在不使用cbind 的情况下通过直接将结果分配给data.frame 中的列来实现这一点:

        df$nominated_group <- with(df, group[match(nominated_ID, ID)])
        df
          ID group nominated_ID nominated_group
        1  9   Odd            9             Odd
        2  5   Odd            8            <NA>
        3  2  Even            4            Even
        4  4  Even            9             Odd
        5  3   Odd            2            Even
        

        我使用with 作为一种方便的方式来引用df 的列,而不必重复写df$

        【讨论】:

          猜你喜欢
          • 2022-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-03
          • 2021-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多