我有一个包含三列的 df:name、test 和 value。他们描述了对某人的化学反应测量。
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?
我想这就是你想要的。对于每个
name
组,它仅保留 "urea"
值总数等于 "creat"
列中 test
值总数的组。
library(dplyr)
df |>
filter(sum(test == "urea") == sum(test == "creat"), .by = name)
这是
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
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