r-如何在不删除行的情况下保持对data.table中变量的第一次观察



我想从一个变量中删除除第一个之外的所有观测值。但这对我来说很棘手:我不想影响我的其余数据

在数据中有没有一种有效的方法可以从我的DTin到我的DTout?

如果不删除行,我就无法做到这一点。

> DTin
V1 V2
1: aa  1
2: aa  2
3: aa  3
4: aa  4
5: bb  1
6: bb  2
7: bb  3
8: bb  4
9: cc  1
10: cc  2
11: cc  3
12: cc  4
> DTout
V1 V2
1: aa  1
2:     2
3:     3
4:     4
5: bb  1
6:     2
7:     3
8:     4
9: cc  1
10:     2
11:     3
12:     4

这是代表:

library(data.table)
DTin <- data.table(V1 = rep(c('aa', 'bb', 'cc'), each = 4),
V2 = rep(seq(1:4), 3))
DTout <- data.table(V1 = c('aa', '', '', '', 'bb', '', '', '', 'cc', '', '', ''),
V2 = rep(seq(1:4), 3))

非常感谢!

使用此

DTin[rowid(V1) != 1, V1 := "", by = V1]
#OR
DTin[c(1, diff(rleid(V1))) != 1, V1 := ""]
DTin
V1 V2
1: aa  1
2:     2
3:     3
4:     4
5: bb  1
6:     2
7:     3
8:     4
9: cc  1
10:     2
11:     3
12:     4

dplyr方法

DTin %>% group_by(V1) %>%
mutate(V1 = ifelse(row_number() ==1, V1, "")) %>%
ungroup()
# A tibble: 12 x 2
V1       V2
<chr> <int>
1 "aa"      1
2 ""        2
3 ""        3
4 ""        4
5 "bb"      1
6 ""        2
7 ""        3
8 ""        4
9 "cc"      1
10 ""        2
11 ""        3
12 ""        4

非常简单的拆分应用合并策略。我不清楚您是否希望替换为NA或其他值,这就是我参数化此选项的原因。

DT <- split(DT, by= 'V1')
DT <- rbindlist(lapply(DT, function(l, sub= NA) {
nr <- nrow(l)
first <- l[, V1][1]
l[, V1 := c(first, rep(sub, nr - 1))]
return(l)
}, sub= NA))
print(DT)

V1 V2
1:   aa  1
2: <NA>  2
3: <NA>  3
4: <NA>  4
5:   bb  1
6: <NA>  2
7: <NA>  3
8: <NA>  4
9:   cc  1
10: <NA>  2
11: <NA>  3
12: <NA>  4
DTout <- copy(DTin)[V2 != 1, V1:=""]

一个更简单的解决方案:

DTout <- copy(DTin)[, V1 := fifelse(V2 == 1, V1, rep("", 4))]

最新更新