【问题标题】:Count number of rows in another dataframe计算另一个数据框中的行数
【发布时间】:2018-11-17 01:14:03
【问题描述】:

我有两个数据框 df1df2

df1 <- data.frame(id=1:5, var1=c("c3e", "d3r", "ff2", "dfl", "df4"))
df2 <- data.frame(id=1:10, var1=c("d3r", "d3r", "c3e", "dfl", "dfl", "dfl", "c3e", "df4", "c3e", "c3e"))

如何最好地在df1 中创建一个新列,给出df1$var1df2 中每个值的出现次数?例如。 'c3e' 出现四次,'d3r' 出现两次,以此类推。

【问题讨论】:

  • c3e 出现了 4 次,不是吗?
  • @LAP,这不尊重订单。合并更安全,即merge(df1, as.data.frame(table(df2$var1)), by.x = "var1", by.y = "Var1", all.x = TRUE)

标签: r merge count tidyverse


【解决方案1】:

这是data.table的一个选项

library(data.table)
setDT(df1)[setDT(df2)[df1, .N,  on = .(var1), by = .EACHI],
                 count := N , on = .(var1)]
df1
#   id var1 count
#1:  1  c3e     4
#2:  2  d3r     2
#3:  3  ff2     0
#4:  4  dfl     3
#5:  5  df4     1

【讨论】:

    【解决方案2】:
    df1$count <- table(df2$var1)[df1$var1]
    df1$count[is.na(df1$count)] <- 0          # change NA to 0
    
    df1
    #   id var1 count
    # 1  1  c3e     4
    # 2  2  d3r     2
    # 3  3  ff2     0
    # 4  4  dfl     3
    # 5  5  df4     1
    

    @Jaap 也有一个不错的建议:

    df1$count <- table(factor(df2$var1, levels = df1$var1))
    

    【讨论】:

    • 另一种可能:table(factor(df2$var1, levels = df1$var1))
    • 谢谢@Jaap!那更好! :)
    【解决方案3】:

    我们可以遍历df1$var1 的每个值,并计算该值在df2s var1 中出现的次数。

    df1$count <- sapply(df1$var1, function(x) sum(df2$var1 %in% x))
    
    df1
    #  id var1 count
    #1  1  c3e     4
    #2  2  d3r     2
    #3  3  ff2     0
    #4  4  dfl     3
    #5  5  df4     1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 2021-05-17
      • 1970-01-01
      相关资源
      最近更新 更多