【问题标题】:Is there a function in R that will let me create a new data frame that contains the duplicated values from the first data frame?R中是否有一个函数可以让我创建一个新的数据框,其中包含第一个数据框中的重复值?
【发布时间】:2020-07-23 07:51:18
【问题描述】:

这是我的例子。从这个数据框中,我想创建一个新的数据框,其中包含基于列、mgb 和列中的匹配的行,tsg 从而省略了其他行。

mbr  mbg tsr tsg
1   1   g1   3  g4
2   2   g2   4  g3
3   3   g3   5  g2
4   4   g4   6  g1
5   5   g5   7  g5
6  NA <NA>   1  g6
7  NA <NA>   2  g7

所以理想情况下它会返回这个数据框:

mbr  mbg tsr tsg
1   1   g1   3  g4
2   2   g2   4  g3
3   3   g3   5  g2
4   4   g4   6  g1
5   5   g5   7  g5

到目前为止我已经尝试过:

1) intersect(df$mbg,df$tsg) 但仅返回列之间匹配项的列表,例如g1、g2 等...

2)df2&lt;-[intersect(df$mbg,df$tsg),]

返回这个:

     mbr  mbg tsr  tsg
NA    NA <NA>  NA <NA>
NA.1  NA <NA>  NA <NA>
NA.2  NA <NA>  NA <NA>
NA.3  NA <NA>  NA <NA>
NA.4  NA <NA>  NA <NA>

我对 R 非常陌生,并且正在尝试自学,因此任何建议都会令人惊叹。谢谢!

【问题讨论】:

  • 我不明白你的描述。看起来您所做的只是过滤 mbg 和 tsr 为非 NA 的行。您是否试图查找 mbg 包含在 tsg 中的行,而这只是所有非 NA 行的巧合?如果是这样,您应该可以使用%in%

标签: r dataframe duplicates subset intersect


【解决方案1】:

如果您只是想删除 NA 并写入新数据帧:

complete.df <- na.omit(df) 

【讨论】:

    【解决方案2】:

    假设我正确地解释了您正在寻找的内容,那么您似乎走在了正确的轨道上,只是遇到了语法问题。试试这个

    df2<-df[df$mbg %in% intersect(df$mbg,df$tsg),]
    

    intersect(df$mbg, df$tsg) 正在返回出现在这两列中的值。在括号前添加 df 标识您想要的数据框的子集,您之前缺少该数据框,df$mbg %in% 部分表示您希望包含 mbg 值的行包含在交集中。

    【讨论】:

    • 谢谢!抱歉回复晚了,但这个解决方案效果很好!
    • 嘿,该函数适用于一组数据非常好,但是当我使用更大的一组数据时,我的列之间存在差异,它根本不起作用,请你帮帮我吗?
    • 我不完全确定您所说的“列之间的差异”是什么意思,以及它是如何“根本不起作用”的——比如它是如何不起作用的?我确实看到有人在上面指出你真的不需要相交部分,可以做df[df$mbg %in% df$tsg, ]。 (我离开 intersect 只是为了建立您已经尝试过的内容。)如果这是一个性能问题,也许删除 intersect 部分会有所帮助?
    【解决方案3】:

    您甚至不需要intersect 部分。

    df2 <- df1[df1$mbg %in% df1$tsg, ]
    

    %in% 运算符将返回TRUE/FALSE 的向量,用于判断mbg 中的每个元素是否与tsg 中的值相交(或相交)

    或者,使用dplyr 库(如果您是 R 新手,我建议您学习)

    library(dplyr)
    
    df2 <- filter(df1, mbg %in% tsg) 
    

    【讨论】:

    • 抱歉回复晚了!感谢您的帮助,我尝试了这个和下面的另一个解决方案,并且都运行良好。我目前正在查看 dplyr 包。所以我尝试使用 dplyr 方式,我的列似乎很快就失去了匹配,即在前 4 个结果之后,为什么会这样?
    【解决方案4】:
    library(dplyr)
    
    df %>% 
      semi_join(df, c('mbg' = 'tsg'))
    
    #   mbr mbg tsr tsg
    # 1   1  g1   3  g4
    # 2   2  g2   4  g3
    # 3   3  g3   5  g2
    # 4   4  g4   6  g1
    # 5   5  g5   7  g5
    

    【讨论】:

      猜你喜欢
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 2022-11-23
      • 2022-10-04
      • 2021-07-23
      • 1970-01-01
      相关资源
      最近更新 更多