[英]Merge two data frames by matching levels of factor- matching factor levels added as columns
我有兩個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
在兩個數據幀和添加一列(S)到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)]
您可以使用dplyr::left_join
加入df1
和df2
。 匯總數據以進行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
參數,以避免不必要的警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.