gpt4 book ai didi

R:名称相同时在行中求和值

转载 作者:行者123 更新时间:2023-12-04 10:31:28 24 4
gpt4 key购买 nike

我在 R 中有一个数据框,我想在其中对共享名称的行的值求和,并记录每一行的假名。谁能想到一种有效的方法来做到这一点?我写了一个 for 循环(复制在下面),但它在大型数据集上效率极低。

提前致谢!

此数据集中给出了一些内容:(1) 不超过 2 个站点将共享一个名称,并且 (2) 这两个站点将始终在连续的行中排在下一个。我也对非 R 解决方案持开放态度,尽管我对其他框架不太熟悉。

示例初始数据:

name, fake_name, value1, value2, value3
siteX, siteX, 4, 2, 0.5
siteX, siteX2, 1, 4, 0.2
siteY, siteY, 2, 1, 0.4
siteZ, siteZ, 8, 3, 0.2

转换为:

name, value1, value2, value3, fake_name, dup_fake_name
siteX, 5, 6, 0.7, siteX, siteX2
siteY, 2, 1, 0.4, siteY, NA
siteZ, 8, 3, 0.2, siteZ, NA

For 循环版本:

data[,c(1,3:5,2)] -> d2; d2$dup_fake_name <- NA
for (i in 1:(nrow(data)-1) {
if (data$name[i] == data$name[i+1]) {
data$value[i] <- data$value[i] + data$value[i+1]
data$dup_fake_name[i] <- data$fake_name[i+1]
}}

最佳答案

如果您不关心转换数据中的最后两列,您可以聚合条目

 df <- structure(list(
name = c("siteX", "siteX", "siteY", "siteZ"),
fake_name = c("siteX", "siteX2", "siteY", "siteZ"),
value1 = c(4L, 1L, 2L, 8L),
value2 = c(2L, 4L, 1L, 3L),
value3 = c(0.5, 0.2, 0.4, 0.2)),
.Names = c("name", "fake_name", "value1", "value2", "value3"),
class = "data.frame", row.names = c(NA, -4L))

df.agg <- aggregate(cbind(value1, value2, value3) ~ name, data = df, FUN = sum);
#name value1 value2 value3
#1 siteX 5 6 0.7
#2 siteY 2 1 0.4
#3 siteZ 8 3 0.2

添加 ID 有点麻烦(丑陋):

# Split based on df$name
ID <- lapply(split(df, df$name), function(x) x$fake_name)

# Pad with NA's to have the same number of columns
ID <- do.call(rbind.data.frame, lapply(ID, function(x) {
if (length(x) < max(sapply(ID, length))) {
x <- c(x, rep(NA, max(sapply(ID, length)) - length(x)))
}
return(x);
}))
colnames(ID) <- paste("fake_name_", 1:ncol(ID), sep = "");

# Add ID columns to df.agg
df.agg <- cbind.data.frame(df.agg, ID);
df.agg;
# name value1 value2 value3 fake_name_1 fake_name_2
#1 siteX 5 6 0.7 siteX siteX2
#2 siteY 2 1 0.4 siteY <NA>
#3 siteZ 8 3 0.2 siteZ <NA>

关于R:名称相同时在行中求和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46901141/

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