gpt4 book ai didi

r - 在 data.table 中添加行,但在某些列采用相同值时不添加行

转载 作者:行者123 更新时间:2023-12-02 08:22:01 26 4
gpt4 key购买 nike

我有一个 data.table dat 有 4 列,比如说 (col1, col2, col3, col4)。

输入数据:

structure(list(col1 = c(5.1, 5.1, 4.7, 4.6, 5, 5.1, 5.1, 4.7, 
4.6, 5), col2 = c(3.5, 3.5, 3.2, 3.1, 3.6, 3.5, 3.5, 3.2, 3.1,
3.6), col3 = c(1.4, 1.4, 1.3, 1.5, 1.4, 3.4, 3.4, 1.3, 1.5, 1.4
), col4 = structure(c(1L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L), .Label = c("setosa",
"versicolor", "virginica", "eer"), class = "factor")), .Names = c("col1",
"col2", "col3", "col4"), row.names = c(NA, -10L), class = c("data.table",
"data.frame"))

r
col1 col2 col3 col4
1: 5.1 3.5 1.4 setosa
2: 5.1 3.5 1.4 setosa
3: 4.7 3.2 1.3 setosa
4: 4.6 3.1 1.5 setosa
5: 5.0 3.6 1.4 setosa
6: 5.1 3.5 3.4 eer
7: 5.1 3.5 3.4 eer
8: 4.7 3.2 1.3 eer
9: 4.6 3.1 1.5 eer
10: 5.0 3.6 1.4 eer

我正在对 col3 的每个唯一值执行以下操作 col4

dat[ , r_new:= sum(col3, na.rm = T), .(col4)]    #syntax 1

因此,上面的 sytnax 正在创建一个新列 r_new,其值是通过添加 col3 的值而获得的,其中 col4 是相同的。因此,col4 的每个唯一值将在 r_new 列中具有唯一值。

我现在想做的是和上面一样,但包括那些 col1col2 所在的行采用相同的值(如下所示)

dat[col1 is different OR col2 is different , r_new:= sum(col3, na.rm = T), .(col4)]

这会做什么,在对行执行 sum 函数时,它不会包括那些 col1col2 都采用相同的行值(value)观。

如何在与 1 相同的语法中包含此条件?

预期输出:

    col1 col2 col3   col4 r_new
1: 5.1 3.5 1.4 setosa 5.6
2: 5.1 3.5 1.4 setosa 5.6
3: 4.7 3.2 1.3 setosa 5.6
4: 4.6 3.1 1.5 setosa 5.6
5: 5.0 3.6 1.4 setosa 5.6
6: 5.1 3.5 3.4 eer 7.6
7: 5.1 3.5 3.4 eer 7.6
8: 4.7 3.2 1.3 eer 7.6
9: 4.6 3.1 1.5 eer 7.6
10: 5.0 3.6 1.4 eer 7.6

正如您在预期输出中看到的,对于 setosa,第 1 行和第 2 行对 col1col2 以及 err 第 6 行和第 7 行为 col1col2 取了相同的值,因此我们没有添加这些行(我们只考虑了一次)。不要担心 col3(如果 col1col2 取相同的值,它将取相同的值。

编辑:第二输出:

structure(list(col1 = c(5.1, 5.1, 4.7, 4.6, 5, 5.1, 5.1, 4.7, 
4.6, 5.1), col2 = c(3.5, 3.5, 3.2, 3.1, 3.6, 3.5, 3.5, 3.2, 3.1,
3.4), col3 = c(1.4, 1.4, 1.3, 1.5, 1.4, 3.4, 3.4, 1.3, 1.5, 3.4
), col4 = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"),
count = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), r_new = c(5.6, 5.6,
5.6, 5.6, 5.6, 9.6, 9.6, 9.6, 9.6, 9.6)), .Names = c("col1",
"col2", "col3", "col4", "count", "r_new"), row.names = c(NA,
-10L), class = c("data.table", "data.frame"))

col1 col2 col3 col4 count r_new
1: 5.1 3.5 1.4 A 1 5.6
2: 5.1 3.5 1.4 A 1 5.6
3: 4.7 3.2 1.3 A 1 5.6
4: 4.6 3.1 1.5 A 1 5.6
5: 5.0 3.6 1.4 A 1 5.6
6: 5.1 3.5 3.4 B 1 9.6
7: 5.1 3.5 3.4 B 1 9.6
8: 4.7 3.2 1.3 B 1 9.6
9: 4.6 3.1 1.5 B 1 9.6
10: 5.1 3.4 3.4 B 1 9.6

编辑 2:第三次输出

   col1 col2 col3 col4 count r_new
1: 5.1 3.5 1.4 A 1 5.6
2: 5.1 3.5 1.4 A 1 5.6
3: 4.7 3.2 1.3 A 1 5.6
4: 4.6 3.1 1.5 A 1 5.6
5: 5.0 3.6 1.4 A 1 5.6
6: 5.1 3.5 3.4 B 1 6.2
7: 5.1 3.5 3.4 B 1 6.2
8: 4.7 3.2 1.3 B 1 6.2
9: 4.6 3.1 1.5 B 1 6.2
10: 5.1 3.5 3.4 B 1 6.2


structure(list(col1 = c(5.1, 5.1, 4.7, 4.6, 5, 5.1, 5.1, 4.7,
4.6, 5.1), col2 = c(3.5, 3.5, 3.2, 3.1, 3.6, 3.5, 3.5, 3.2, 3.1,
3.5), col3 = c(1.4, 1.4, 1.3, 1.5, 1.4, 3.4, 3.4, 1.3, 1.5, 3.4
), col4 = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"),
count = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), r_new = c(5.6, 5.6,
5.6, 5.6, 5.6, 6.2, 6.2, 6.2, 6.2, 6.2)), .Names = c("col1",
"col2", "col3", "col4", "count", "r_new"), row.names = c(NA,
-10L), class = c("data.table", "data.frame"))

最佳答案

我们可以使用 ?data.table::duplicatedj 中子集 col3

dat[, r_new := sum(col3[!duplicated(.SD, by = c("col1","col2"))], na.rm = T), by = col4]  

> dat
# col1 col2 col3 col4 count r_new
# 1: 5.1 3.5 1.4 A 1 5.6
# 2: 5.1 3.5 1.4 A 1 5.6
# 3: 4.7 3.2 1.3 A 1 5.6
# 4: 4.6 3.1 1.5 A 1 5.6
# 5: 5.0 3.6 1.4 A 1 5.6
# 6: 5.1 3.5 3.4 B 1 6.2
# 7: 5.1 3.5 3.4 B 1 6.2
# 8: 4.7 3.2 1.3 B 1 6.2
# 9: 4.6 3.1 1.5 B 1 6.2
#10: 5.1 3.5 3.4 B 1 6.2

关于r - 在 data.table 中添加行,但在某些列采用相同值时不添加行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36232684/

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