按对对列进行分组:条件分组?

问题描述 投票:0回答:3

我有一个包含三列的 df:nametestvalue。他们描述了对某人的化学反应测量。

df <- data.frame(name=c("A","A","B","C","C","D"),
                 test=c("urea","creat","urea","urea","creat","creat"),
                 value=c(30,1,40,50,2,0.6))
> df
  name  test value
1    A  urea  30.0
2    A creat   1.0
3    B  urea  40.0
4    C  urea  50.0
5    C creat   2.0
6    D creat   0.6

我需要仅使用 urea 或 creat test 或相等的配对名称对值进行分组或过滤,以便 df 可以变为:

  name  test value
1    A  urea  30.0
2    A creat   1.0
3    C  urea  50.0
4    C creat   2.0

这是我一直在研究的解决方案,但它并没有真正起作用。

ndf <- data.frame()
n<-6
while(n>0){
    ifelse(df[n,2]=="creat" && df[n-1,2]=="urea",
        n<-n-2
        ndf <- add_row(ndf, df[(n-1):n,2]),
        n<-n-1)
}

是否有任何“整洁”的方式来分组或按对进行过滤?也许是 row_wise?

r dplyr
3个回答
4
投票

我想这就是你想要的。对于每个

name
组,它仅保留
"urea"
值总数等于
"creat"
列中
test
值总数的组。

library(dplyr)
df |>
  filter(sum(test == "urea") == sum(test == "creat"), .by = name)

2
投票

这是

subset
的基本 R 选项,使用
match
 中的技巧 
ave

> subset(df, ave(match(test, c("urea", "creat")), name) == 1.5)
  name  test value
1    A  urea    30
2    A creat     1
4    C  urea    50
5    C creat     2

0
投票

df %>% 
  pivot_wider(names_from = test, values_from = value) %>% 
  filter(complete.cases(.)) %>% 
  pivot_longer(cols = c("urea", "creat"), names_to = "test", values_to = "value")

替代解决方案...

  name  test  value
  <chr> <chr> <dbl>
1 A     urea     30
2 A     creat     1
3 C     urea     50
4 C     creat     2
© www.soinside.com 2019 - 2024. All rights reserved.