我有一个非常大的数据表,如下所示:
Name Type U1 U2 U3
1 A Max 0 543 0
2 A Min -324 0 -876
3 B Max 4536 0 0
4 B Min 0 -56 -96
5 C Max 0 543 0
6 C Min -32 0 -426
7 D Max 4612 0 0
8 D Min 0 -456 -86
对于每个名称(A、B、C、D),每列有两个值,一个用于最大值,一个用于最小值。两者之间的一永远为零。要么最大值为零且最小值为负,要么最小值为零且最大值为正。我想创建 data.frame 的一个子集,在其中我可以组合与相同名称(A、B、C、D)对应的行并删除等于零的单元格。
我不确定最好的方法是什么。任何指导表示赞赏!
您可以group_by
Name
选择 3 列中的非零值
library(dplyr)
df %>%
group_by(Name) %>%
summarise(across(starts_with('U'), ~.[.!=0]))
#In previous dplyr
#summarise_at(vars(starts_with('U')), ~.[.!=0])
# A tibble: 4 x 4
# Name U1 U2 U3
# <chr> <int> <int> <int>
#1 A -324 543 -876
#2 B 4536 -56 -96
#3 C -32 543 -426
#4 D 4612 -456 -86
sum
如果每列只有 2 行,Name
并且其中之一始终为 0,则您也可以列
df %>% group_by(Name) %>% summarise(across(starts_with('U'), sum))
aggregate
在基础 R 中使用:
aggregate(cbind(U1, U2, U3)~Name, df, function(x) x[x!=0])
并与sum
:
aggregate(cbind(U1, U2, U3)~Name, df, sum)
数据
df <- structure(list(Name = c("A", "A", "B", "B", "C", "C", "D", "D"
), Type = c("Max", "Min", "Max", "Min", "Max", "Min", "Max",
"Min"), U1 = c(0L, -324L, 4536L, 0L, 0L, -32L, 4612L, 0L), U2 = c(543L,
0L, 0L, -56L, 543L, 0L, 0L, -456L), U3 = c(0L, -876L, 0L, -96L,
0L, -426L, 0L, -86L)), class = "data.frame", row.names = c(NA, -8L))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句