r - 通过匹配作为列添加的因子匹配因子级别的级别来合并两个数据框
问题描述
我有两个df。它们的行数不同,但有一个共同的列lepsp
。
set.seed(571)
year = as.factor(c(rep("1998", 20), rep("1999", 16)))
lepsp = c(letters[1:20], c('a','b','c'),letters[8:20])
freq = rpois(36, lambda=12)
df1 <- data.frame(year, lepsp, freq)
lepsp = c(letters[1:26],c('a','b','c'),letters[1:20],c('e','f',"h"))
plntsp = c(paste("plnt", sep= "_", letters[1:26]),
paste("plnt",sep="_",letters[1:20]),
paste("plnt",sep="_",letters[18:23]))
df2 <- data.frame(lepsp, plntsp)
我想lepsp
在两个数据框中进行匹配,并添加一个列来df1
指定每个plntsp
与每个关联的 lepsp
. 每个唯一的都plntsp
需要合并为一个新列。如果没有关联的植物,则这些条目可以留空。新的 df 应该如下所示:
df <- data.frame(lepsp=unique(c(letters[1:5],letters[14:18])),
plntsp1=c("","","plnt_a","plnt_b","plnt_c","","","","",""),
plntsp2=c("","","", "plnt_c","plnt_d","","","","",""))
我过去曾使用它进行匹配,但不确定如何调整它以便将每个级别plntsp
添加为新列。
df1$plntsp<-df2$plntsp[match(df1$lepsp, df2$lepsp)]
解决方案
您可以加入df1
和df2
使用dplyr::left_join
。为 汇总数据leapsp
。最后,在多列中使用splitstackshape::cSplit
单独的:plntsp
library(tidyverse)
library(splitstackshape)
left_join(df1, df2, by="lepsp") %>%
select(lepsp, plntsp) %>%
distinct() %>%
group_by(lepsp) %>%
summarise(plntsp = toString(plntsp)) %>%
ungroup() %>%
cSplit("plntsp")
# lepsp plntsp_1 plntsp_2 plntsp_3
# 1: a plnt_a plnt_d NA
# 2: b plnt_b plnt_e NA
# 3: c plnt_c plnt_f NA
# 4: d plnt_d plnt_g NA
# 5: e plnt_e plnt_h plnt_u
# 6: f plnt_f plnt_i plnt_v
# 7: g plnt_g plnt_j NA
# 8: h plnt_h plnt_k plnt_w
# 9: i plnt_i plnt_l NA
# 10: j plnt_j plnt_m NA
# 11: k plnt_k plnt_n NA
# 12: l plnt_l plnt_o NA
# 13: m plnt_m plnt_p NA
# 14: n plnt_n plnt_q NA
# 15: o plnt_o plnt_r NA
# 16: p plnt_p plnt_s NA
# 17: q plnt_q plnt_t NA
# 18: r plnt_r NA NA
# 19: s plnt_s NA NA
# 20: t plnt_t NA NA
注意:请stringsAsFactors = FALSE
在创建数据框时使用参数以避免不必要的警告。
推荐阅读
- jquery - 使用 laravel8 一次将数据存储到两个表中
- python - 为什么 Markercluster 搜索栏会出错
- python - 从包含标题和值的数据框列中提取标题
- linux - leave-ret 和系统调用退出有什么区别?
- c# - CBFS c# - 从事件处理程序内的文件中读取一些字节
- python - Ubuntu 上的本机消息传递清单文件位置
- excel - 在 Excel 中,如何将一个单元格中的数字列表(例如 1、3、7)转换为相邻单元格中的虚拟变量(1)?
- codeigniter - 如何在表格中计算id和shows
- python - 无法在安装了 gevent 的情况下运行 Flask 应用程序
- java - 如何验证被测类内的交互?