我想从一个变量中删除除第一个之外的所有观测值。但这对我来说很棘手:我不想影响我的其余数据
在数据中有没有一种有效的方法可以从我的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))]