【发布时间】:2020-09-04 15:28:23
【问题描述】:
这个问题建立在另一个问题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 始终存在且数字)或因子列,该解决方案也必须有效。
提前谢谢!
【问题讨论】:
-
不明白非唯一因子列的处理规则(即使很少见,规则也必须清楚)。例如,如果要将行
structure(list(time = 4, abst = 5, farbe = structure(3L, .Label = c("blau", "keine", "rot"), class = "factor"), gier = 5, goff = structure(3L, .Label = c("haus", "maus", "toll"), class = "factor"), huft = structure(2L, .Label = c("holz", "wolle"), class = "factor"), mode = 5), row.names = c(NA, -1L ), class = c("data.table", "data.frame"))添加到dt,您的预期结果是什么? -
IIUC,您的预期结果假设每个
time最多有一个非唯一因子列(在删除NAs 之后)。如果有两个或更多非唯一因子列,您的预期结果是什么? -
@Bolle 我的解决方案出了什么问题。
-
@akrun,您的解决方案很棒而且没有错。但是如果你想使用更少的包并且不想定义所有的因子列,Uwe 的其他解决方案更方便。
-
我的意思是另一个解决方案与我的几乎相似。无论如何,当有人做了一个小改动并得到标记时,这有点烦人
标签: r datatable time-series aggregate