【问题标题】:Find duplicates in two rows and apply function to all columns在两行中查找重复项并将函数应用于所有列
【发布时间】:2015-09-11 14:26:37
【问题描述】:

在此示例中,我需要检查第一列 - 名称中是否有任何重复项。有 - 前 3 行。现在我知道了 - 我需要检查“etc2”列在前 3 行中是否也有重复项。在这种情况下,只有前 2 行是重复的。然后我需要取这 2 行中所有列的平均值。在此之后,我继续使用“名称”。现在第 5 行和第 6 行也具有相同的值,然后我检查“etc2”中的值是否相同。它们是,所以我需要找到这两行中所有列的平均值。

例如,我有这样的数据

dat <- read.table(text='name    value   etc1    etc2
                  A       9       20       X
                  A       10      10       X
                  A       11      1       Y
                  B       2       5       Y
                  C       40      40       Y
                  C       50      2       Y',header=TRUE)

而我最终需要的是这个

name    value   etc1    etc2
   A      9.5     15       X
   A       11      1       Y
   B        2      5       Y
   C     99.5     21       Y

我的数据集包含很多行和列,所以我正在寻找更通用的解决方案。我尝试过应用程序来查找重复值,然后在 ifelse 中使用这个数字来获取列总和,但运气不佳。

apply(df, MARGIN = 2, FUN = duplicated) 

nx <- which(apply(df, MARGIN = 2, FUN = duplicated))[1] 

df[1, nx] # the duplicated value

ifelse(is.element(df[, 4], df[1, nx]) == TRUE, yes = colwise(mean, (df[, 1:4]), no = print("No"))) 

从这里开始或多或少地卡住了

【问题讨论】:

  • 我认为您的期望输出有误。

标签: r duplicates apply


【解决方案1】:

你正在寻找一个聚合函数,所以试试aggregate

> aggregate(. ~ name + etc2, dat, mean)
  name etc2 value etc1
1    A    X   9.5   15
2    A    Y  11.0    1
3    B    Y   2.0    5
4    C    Y  45.0   21

其他选项包括“data.table”和“dplyr”,这两个选项都比base R的aggregate高效得多。

> library(data.table)
> as.data.table(dat)[, lapply(.SD, mean), by = .(name, etc2)]
   name etc2 value etc1
1:    A    X   9.5   15
2:    A    Y  11.0    1
3:    B    Y   2.0    5
4:    C    Y  45.0   21
> 
> library(dplyr)
> dat %>% group_by(name, etc2) %>% summarise_each(funs(mean))
Source: local data frame [4 x 4]
Groups: name [?]

    name   etc2 value  etc1
  (fctr) (fctr) (dbl) (dbl)
1      A      X   9.5    15
2      A      Y  11.0     1
3      B      Y   2.0     5
4      C      Y  45.0    21

【讨论】:

    猜你喜欢
    • 2016-09-24
    • 2023-03-16
    • 2013-04-11
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多