r - 生成一个循环来匹配 ID

标签 r dplyr

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

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 以及可能的用户定义函数。

最佳答案

这是您要找的吗?

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

关于r - 生成一个循环来匹配 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41810105/

相关文章:

r - 错误: could not find function “%>%”

r - 在数据框内扩展数据框

r - 在 R 中连接数据框和空间多边形数据框

在数据帧的列中紧跟其后用数字替换前导 0

r - 如何使用管道将数据帧列作为函数中的参数传递?

R删除条目不是日期的行

R:使用来自另一个数据框的映射在数据框中创建一个新列

r - data.table 的 `:=` 操作符真的是引用操作吗?

R - 按多列分组

r - 如何在文件中复制终端/提示,例如使用历史记录 + 接收器