gpt4 book ai didi

r - 使用 NA 聚合并保留行

转载 作者:行者123 更新时间:2023-12-04 14:27:44 24 4
gpt4 key购买 nike

我想要做的是:按名称和类别排列数据,按年份排序,计算值的平均值并保留 valueMessage .

样本数据:

name <- c("a", "a", "b", "b")
class <- c("c1", "c1", "c3", "c3")
year <- c("2010", "2010", "2008", "2008")
value <- c(100, 33, 100, 90)
valueMessage <-c(NA, "meh", NA, NA)

df <- data.frame(name, class, year, value, valueMessage)
df


dat <- aggregate(df$value, list(year = df$year, name = df$name, class=df$class, valueMessage=df$valueMessage), mean)
dat <- dat[with(dat, order(class, name, year)), ]

返回这个:
year name class valueMessage  x
1 2010 a c1 meh 33

但我希望它保留 NA 并返回如下内容:
year name class valueMessage  x
1 2010 a c1 meh, NA 66.5
2 2008 b c3 NA 95

最佳答案

问题是您正在尝试进行两种不同的聚合:一种用于“值”列,另一种用于“valueMessage”列。

如果是这种情况,您将不得不分别进行,并且 merge他们,或者看看使用一个包,比如“data.table”来帮忙。

使用“data.table”,您可以执行以下操作:

library(data.table)
DT <- data.table(df)
DT[, list(value = mean(value),
valueMessage = list(unique(valueMessage))),
by = list(year, name, class)]
# year name class value valueMessage
# 1: 2010 a c1 66.5 NA,meh
# 2: 2008 b c3 95.0 NA

请注意,“valueMessage”列是 list .您可以使用 paste如果你想让它成为一个字符向量。换句话说:
DT[, list(value = mean(value), 
valueMessage = paste(unique(valueMessage), collapse = ",")),
by = list(year, name, class)]

在这里,我假设您只对独特的“valueMessage”值感兴趣。

如果您想使用 base R 的 aggregate ,您可以尝试以下操作:
M1 <- aggregate(value ~ year + name + class, df, mean)
M2 <- aggregate(as.character(valueMessage) ~ year + name + class,
df, unique, na.action = na.pass)
merge(M1, M2)

我使用了“公式”方法,因为我更喜欢输出。 as.character(valueMessage)是必需的,因为该列目前是 factor . valueMessage的输出列将再次是 list ,但您可以使用匿名函数和 paste如果您更喜欢 length 的字符向量1 代替。

关于r - 使用 NA 聚合并保留行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24647832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com