根据r中列中的常见字符组合数据帧的行

马拉多里

我有一个非常大的数据表,如下所示:

    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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章