【问题标题】:Generating a loop to match ID's生成一个循环来匹配 ID
【发布时间】:2017-01-23 15:39:46
【问题描述】:

我有两个数据框,每个都包含标识符。

df1 <- data.frame(ID = c(20001, 20001, 20003, 20003, 20003, 20003))
df2 <- data.frame(ID = c(20001, 20001, 20003, 20003, 20003, 20005),
                  Type = c('N1', 'N2', 'N3', 'N4', 'N5', 'N6'))

我想通过匹配 ID 在 df1 中使用 df2$Type 的值创建第二列。这是我查找值的常用方法

df1$Add <- df2$Type[match(df1$ID, df2$ID)]

但是,使用这种匹配方法将获得第一个 ID 匹配并带来相应的值给我这样的东西

ID     Add
20001  N1
20001  N1
20003  N3
20003  N3
20003  N3
20003  N3

相反,我想为每个重复的 ID 引入“下一个”类型值,基本上是在循环中。理想情况下,我想关注输出。

ID     Add
20001  N1
20001  N2
20003  N3
20003  N4
20003  N5
20003  N3

我认为它可能需要使用 lapply 和用户定义的函数。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这就是你要找的吗?

    library(dplyr)
    df1 %>% group_by(ID) %>% 
            mutate(c = rep(df2$Type[df2$ID == unique(ID)], length.out = n()))
    
    #     ID      c
    #1 20001     N1
    #2 20001     N2
    #3 20003     N3
    #4 20003     N4
    #5 20003     N5
    #6 20003     N3
    

    # incase of efficiency, 
    
    library(data.table)
    setDT(df2)
    setDT(df1)[,  x := rep(df2$Type[df2$ID == ID], length.out = .N),by = .(ID)]
    

    # i'm looking for a base R solution without involving merge
    # as of now my bet is on sapply() - but not utilised efficiently
    
    unlist(sapply(unique(df1$ID), function(x) rep(df2$Type[df2$ID == x],
                                                  length.out = sum(x==df1$ID))))
    # [1] N1 N2 N3 N4 N5 N3
    

    【讨论】:

    • 我选择了 dplyr 解决方案,因为它已经为之前的代码块加载了。很好地使用了 mutate,感谢您的帮助。
    猜你喜欢
    • 2020-12-26
    • 2023-02-18
    • 2012-09-22
    • 2022-07-12
    • 2020-04-28
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多