r-在两行中查找重复项,并将函数应用于所有列



在这个例子中,我需要检查第一个列名中是否有重复项。有-前3行。现在我知道了——我需要检查列"etc2"在前3行中是否也有重复项。在这种情况下,只有前两行是重复的。然后我需要取这两行中所有列的平均值。在这之后,我继续使用"名称"。现在第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"))) 

或多或少地在上从此处卡住

您正在寻找一个聚合函数,请尝试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"one_answers"dplyr",这两个选项都比基本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

最新更新