【问题标题】:Comparing elements of a column across multiple dataframes to output number of matches in R将跨多个数据帧的列元素与 R 中的输出匹配数进行比较
【发布时间】:2017-08-23 02:11:34
【问题描述】:

我正在尝试比较 R 中不同长度和顺序的非数字元素的多个数据帧中的单个列。我的数据由来自多个样本的唯一非数字元素组成,这些样本已保存为自己的数据帧,每个数据帧没有双精度,我想将它们与其他几个数据帧进行比较,以查看多个数据帧中出现了哪些元素以及相同元素出现在多少个数据帧中。

样本数据

df1 <- data.frame(names = rep(c("Nina", "Doug", "Alli", "Doug")))
df2 <- data.frame(names = rep(c("Steve", "Alli", "Nina")))
df3 <- data.frame(names = rep(c("Doug", "Steve", "Nina", "Bob")))

  df1    df2    df3
[names] [names] [names]   
 Nina    Steve  Doug   
 Doug    Alli   Steve   
 Alli    Nina   Nina  
 Doug           Bob

现在我想将 df1 df2 df3 与一个输出进行比较,该输出告诉我哪些名称在数据帧中相似以及它们出现了多少次。

输出

Names Matches

Nina [3]
Doug [3]
Alli [2]
Steve[2]
Bob  [1]

我的真实数据集有更多的数据帧和名称,如果输出可以按从大多数数据帧中出现最多到最少出现的顺序排列,那么会有更多好处。

我对 R 相当陌生,甚至不确定如何开始解决这个问题。目前我已经创建了我想相互比较的数据框列表,但非常感谢任何建议。感谢您的时间!

【问题讨论】:

    标签: r dataframe compare


    【解决方案1】:

    试试

    df1 <- data.frame(names = rep(c("Nina", "Doug", "Alli", "Doug")), stringsAsFactors = F)
    df2 <- data.frame(names = rep(c("Steve", "Alli", "Nina")), stringsAsFactors = F)
    df3 <- data.frame(names = rep(c("Doug", "Steve", "Nina", "Bob")), stringsAsFactors = F)
    
    table(c(df1$names, df2$names, df3$names))
    
     Alli   Bob  Doug  Nina Steve 
        2     1     3     3     2 
    

    或者,更多地格式化它:

    df <- data.frame(table(c(df1$names, df2$names, df3$names)))
    names(df) <- c("Names", "Matches")
    

    包括订购:

    df[order(df$Matches, decreasing = T),]
      Names Matches
    3  Doug       3
    4  Nina       3
    1  Alli       2
    5 Steve       2
    2   Bob       1
    

    确保名称不是因子,否则将它们转换为字符。

    【讨论】:

    • 完美!我如何将此方法应用于数据框列表?非常感谢!
    • 如果l 是您的列表,请尝试Reduce(rbind, l),它会给您一个data.frame。然后,您可以在结果上使用上述data.frame(table(...。
    • 或者,如果你加载了library(dplyr),你可以使用bind_rows(l)。
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多