在这个例子中,我需要检查第一个列名中是否有重复项。有-前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