gpt4 book ai didi

R将时间序列中的重复行与数据表中的不同列类型进行组合

转载 作者:行者123 更新时间:2023-12-03 16:12:54 32 4
gpt4 key购买 nike

这个问题是在另一个问题R combining duplicate rows by ID with different column types in a dataframe的基础上建立的。我有一个数据表,其中包含一列time和其他一些不同类型(因子和数字)的列。这是一个例子:

dt <- data.table(time  = c(1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4),
abst = c(0, NA, 2, NA, NA, NA, 0, 0, NA, 2, NA, 3, 4),
farbe = as.factor(c("keine", NA, "keine", NA, NA, NA, "keine", "keine", NA, NA, NA, "rot", "blau")),
gier = c(0, NA, 5, NA, NA, NA, 0, 0, NA, 1, NA, 6, 2),
goff = as.factor(c("haus", "maus", "toll", NA, "haus", NA, "maus", NA, NA, NA, NA, NA, "maus")),
huft = as.factor(c(NA, NA, NA, NA, NA, "wolle", NA, NA, "wolle", NA, NA, "holz", NA)),
mode = c(4, 2, NA, NA, 6, 5, 0, NA, NA, NA, NA, NA, 3))

现在,我想将重复时间合并在 time列中。数字列定义为所有相同ID的平均值(不包含NA!)。因子列合并为一个。 NA可以省略。
dtRes <- data.table(time  = c(1, 1, 1, 2, 3, 4, 4),
abst = c(1, 1, 1, 0, 0, 3, 3),
farbe = as.factor(c("keine", "keine", "keine", "keine", "keine", "rot", "blau")),
gier = c(2.5, 2.5, 2.5, 0, 0, 3, 3),
goff = as.factor(c("haus", "maus", "toll", "maus", NA, "maus", "maus")),
huft = as.factor(c(NA, NA, NA, "wolle", "wolle", "holz", "holz")),
mode = c(4, 4, 4, 2.5, NA, 3, 3))

为此,我需要进行一些快速计算,因为我有大约一百万个观测值。

关于此问题的一些额外想法: farbe可能不是唯一的。在这种情况下,我认为对我的数据最好的方法是有一个重复的行,但只使用不同的 farbe,因此有2个相同的时间,其余所有保持相同,但 farbe的值不同。这应该是非常罕见的情况,但是将是一个很好的补充。

另外:我的真实数据中还有很多数字和因子列,所以我不想单独定义每一个列。在某些数据表中没有因子列。因此,即使没有数字列( time和数字列始终存在)或因子列,该解决方案也必须有效。

提前谢谢!

最佳答案

也可以在不随后调用separate_rows()cSplit()的情况下实现预期结果(对于给定的样本数据集):

library(data.table) # version 1.12.9
dt[, lapply(.SD, function(x) if (is.numeric(x)) mean(x, na.rm = TRUE)
else unlist(na.omit(unique(x)))), by = time]

time abst farbe gier goff huft mode
1: 1 1 keine 2.5 haus <NA> 4.0
2: 1 1 keine 2.5 maus <NA> 4.0
3: 1 1 keine 2.5 toll <NA> 4.0
4: 2 0 keine 0.0 maus wolle 2.5
5: 3 0 keine 0.0 <NA> wolle NaN
6: 4 3 rot 3.0 maus holz 3.0
7: 4 3 blau 3.0 maus holz 3.0

请注意,这种方法适用于数字列和因子列的任意混合;无需明确说明列名。

但是,我确实相信对基本问题的正确答案是,每个 time返回一行,而不是一种部分总计(当然,您的里程可能会有所不同):
dt[, lapply(.SD, function(x) if (is.numeric(x)) mean(x, na.rm = TRUE) 
else list(na.omit(unique(x)))), by = time]

   time abst    farbe gier           goff  huft mode
1: 1 1 keine 2.5 haus,maus,toll 4.0
2: 2 0 keine 0.0 maus wolle 2.5
3: 3 0 keine 0.0 wolle NaN
4: 4 3 rot,blau 3.0 maus holz 3.0


请注意,已使用 list()而不是 toString()来聚合因子列。如果因子级别之一偶然包含逗号 ,,则这样做的好处是可以避免出现问题。此外,在大型生产数据集中更容易识别每个 time中具有非唯一因素的案例:
# compute aggregate as before
dtRes <- dt[, lapply(.SD, function(x) if (is.numeric(x)) mean(x, na.rm = TRUE)
else list(na.omit(unique(x)))), by = time]
# find cases with non-unique factors per group
# note .SDcols = is.list is available with data.table version 1.12.9
tmp <- dtRes[, which(Reduce(sum, lapply(.SD, function(x) lengths(x) > 1L)) > 0), .SDcols = is.list, by = time]
tmp

   time V1
1: 1 1
2: 4 1

# show affected rows
dtRes[tmp, on = "time"]

   time abst    farbe gier           goff huft mode V1
1: 1 1 keine 2.5 haus,maus,toll 4 1
2: 4 3 rot,blau 3.0 maus holz 3 1

# show not affected rows
dtRes[!tmp, on = "time"]

   time abst farbe gier goff  huft mode
1: 2 0 keine 0 maus wolle 2.5
2: 3 0 keine 0 wolle NaN

关于R将时间序列中的重复行与数据表中的不同列类型进行组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61876254/

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