【问题标题】:Merge two data frames by matching levels of factor- matching factor levels added as columns通过匹配作为列添加的因子匹配因子级别的级别来合并两个数据框
【发布时间】:2018-06-01 03:56:41
【问题描述】:

我有两个 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 添加一列,指定与每个lepsp 关联的每个plntsp。每个唯一的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)]

【问题讨论】:

  • letters[seq(from = 1, to = 20 )] 可以简单地写成letters[1:20]。而letters[1:26] 就是letters
  • merge(df1, df2, on='plntsp', ...),但我不清楚您给出的合并结果 df 与 df1 和 df2 的关系。

标签: r dataframe match


【解决方案1】:

您可以使用dplyr::left_join 加入df1df2。汇总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 参数以避免不必要的警告。

【讨论】:

    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多