【问题标题】:R if value in column 1 in table a matches value in column 1 in table b, copy value from column 2 in table b into table 1R 如果表 a 中第 1 列中的值与表 b 中第 1 列中的值匹配,则将表 b 中第 2 列中的值复制到表 1 中
【发布时间】:2015-05-19 15:12:57
【问题描述】:

#Question# 我有 2 个数据框。 1 个数据框 (A) 有多个列。数据框 A 中的第 1 列有一个电子邮件地址,其中多行具有相同的电子邮件地址。另一个数据框 (B) 在第 1 列中有一个唯一电子邮件地址列表,在第 2 列中有该电子邮件出现在数据框 A 列表中的次数的计数。我想基本上做一个 vlookup 以便电子邮件地址匹配从这两个表中,它会将计数拉入数据框 A 的新列中。有人可以帮忙吗?

数据

Table A   
Column 1    Column 2      Column 3  
a@a.com     home          123   
a@a.com     house         456   
b@b.com     tree          221   

Table B   
Column 1    Column 2(Count)      
a@a.com        2   
b@b.com        1   

Expected result should be Table A with an additional column:   
Column 1    Column 2      Column 3     Column 4   
a@a.com      home           123             2   
a@a.com      house          456             2   
b@b.com      tree           221             1   

【问题讨论】:

  • @akrun 添加了问题
  • 如果您已经有两个数据集,那么您也可以加入(通常)即library(data.table);setkey(setDT(df1), Column1)[df2] 假设,如果 'Column2' 值是 Table2 中的一些 'x'、'z',这可以加入创建新列
  • @akrun 不确定为什么我仍然收到错误提示找不到 setDT 函数。我已经加载了 data.table 包
  • 能否显示data.table的版本。我正在使用开发版本,但我认为即使 1.9.4 也可以与 setDT 一起使用
  • 在哪里查看版本?

标签: r


【解决方案1】:

您不需要 df2 来获取计数。您可以单独使用 df1 来获取计数:

#solution using data.table package
library(data.table)
setDT(df1)[,count:=.N,by=Column1]
   Column1 Column2 Column3 count
1: a@a.com    home     123      2
2: a@a.com   house     456      2
3: b@b.com    tree     221      1

#solution using dplyr package
library(dplyr)
df1 %>%
group_by(Column1)%>%
mutate(count=n())
Source: local data frame [3 x 4]
Groups: Column1

  Column1 Column2 Column3 count
1 a@a.com    home     123     2
2 a@a.com   house     456     2
3 b@b.com    tree     221     1
#Data
df1<-structure(list(Column1 = structure(c(1L, 1L, 2L), .Label = c("a@a.com", 
"b@b.com"), class = "factor"), Column2 = structure(1:3, .Label = c("home", 
"house", "tree"), class = "factor"), Column3 = c(123L, 456L, 
221L)), .Names = c("Column1", "Column2", "Column3"), class = "data.frame", row.names = c(NA, 
-3L))

【讨论】:

  • 我有点困惑。我的 df1 被称为结果,我的列名是 email.address。什么是.N?我收到错误提示找不到 setDT 函数
  • .N 为您提供每组中的行数(此处为 Column1)。
  • @TD 这个答案中的两个解决方案都需要安装和加载包(见library 行)。这是您可以将.N 等用于第一个的唯一方法。
  • 我已经加载了 data.table 包,然后我继续收到同样的错误,说找不到 setDT 函数
  • 你用的是哪个版本?
猜你喜欢
  • 1970-01-01
  • 2015-11-30
  • 2022-08-15
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
相关资源
最近更新 更多