如何将 summarise() 函数的结果放入 r 中的数据框中
how to put the results of summarise() function into the dataframe in r
我做了一个最小可复现的例子,但是我的真实数据真的很大
a_p_ <-c(0.1, 0.3, 0.03, 0.03)
b_p_ <-c(0.2, 0.003, 0.1, 0.00001)
c_2<-c(1,2,5,23)
c_p_<-c(0.001, 0.002,0.002,0.00001)
results_1<-data.frame(a_p_,b_p_,c_2,c_p_)
a_p_ <-c(0.3, 0.02, 0.43, 0.44)
b_p_ <-c(0.00002, 0.3, 0.8, 0.005)
c_2 <-c(88,4,55,88)
c_p_<-c(0.1, 0.002,0.002,0.1)
results_2<-data.frame(a_p_,b_p_,c_2,c_p_)
所以,我有两个数据集。一个是“results_1”,另一个是“results_2”
然后,我想创建新的数据框(数据框名称是 type1error)
其中包含以下示例。
更具体地说,我希望这是我的新数据框的第一行(type1error)
> results_1 %>%
+ summarise(across(contains("_p_"), ~ mean(.x > 0.05)))
a_p_ b_p_ c_p_
1 0.5 0.5 0
这是我数据框的第二行(类型 1 错误)
> results_2 %>%
+ summarise(across(contains("_p_"), ~ mean(.x > 0.05)))
a_p_ b_p_ c_p_
1 0.75 0.5 0.5
所以我所做的是..
# make empty holder
type1error<-as.data.frame(matrix(nrow = 2))
for(i in 1:2){
# read the data
if(i==1){
results<-results_1
}
if(i==2){
results<-results_2
}
# mean() You can use mean() to get the proportion of TRUE of a logical vector.
type1error[i,]<-results %>%
summarise(across(contains("_p_"), ~ mean(.x > 0.05)))
type1error$conditions[i] <- i
}
但是我收到了这样的警告信息,结果似乎不是我所期望的
(总结每一行的结果)
Warning messages:
1: In `[<-.data.frame`(`*tmp*`, i, , value = list(a_p_ = 0.5, b_p_ = 0.5, :
provided 3 variables to replace 2 variables
2: In `[<-.data.frame`(`*tmp*`, i, , value = list(a_p_ = 0.75, b_p_ = 0.5, :
provided 3 variables to replace 2 variables
我该如何解决这个问题?
你可以
library(tidyverse)
list(results_1, results_2) %>%
map_dfr(. %>% summarise(across(contains("_p_"), ~ mean(.x > 0.05))))
#> a_p_ b_p_ c_p_
#> 1 0.50 0.5 0.0
#> 2 0.75 0.5 0.5
由 reprex package (v2.0.1)
创建于 2022-05-11
library(dplyr)
bind_rows(results_1 = results_1, # Skip "X =" if you don't
results_2 = results_2, # need descriptive name
.id = "id") %>%
group_by(id) %>%
summarize(across(contains("_p_"), ~mean(.x>0.05)))
# A tibble: 2 × 4
id a_p_ b_p_ c_p_
<chr> <dbl> <dbl> <dbl>
1 results_1 0.5 0.5 0
2 results_2 0.75 0.5 0.5
如果您已经在 tidyverse
工作,我认为发布的答案更加一致,但这里有一个使用更多基本 R 函数的选项:
dfs <- list(results_1, results_2)
do.call(rbind, lapply(dfs, \(x) summarize(x, across(contains("_p_"), ~ mean(. > 0.05)))))
a_p_ b_p_ c_p_
1 0.50 0.5 0.0
2 0.75 0.5 0.5
我做了一个最小可复现的例子,但是我的真实数据真的很大
a_p_ <-c(0.1, 0.3, 0.03, 0.03)
b_p_ <-c(0.2, 0.003, 0.1, 0.00001)
c_2<-c(1,2,5,23)
c_p_<-c(0.001, 0.002,0.002,0.00001)
results_1<-data.frame(a_p_,b_p_,c_2,c_p_)
a_p_ <-c(0.3, 0.02, 0.43, 0.44)
b_p_ <-c(0.00002, 0.3, 0.8, 0.005)
c_2 <-c(88,4,55,88)
c_p_<-c(0.1, 0.002,0.002,0.1)
results_2<-data.frame(a_p_,b_p_,c_2,c_p_)
所以,我有两个数据集。一个是“results_1”,另一个是“results_2”
然后,我想创建新的数据框(数据框名称是 type1error) 其中包含以下示例。
更具体地说,我希望这是我的新数据框的第一行(type1error)
> results_1 %>%
+ summarise(across(contains("_p_"), ~ mean(.x > 0.05)))
a_p_ b_p_ c_p_
1 0.5 0.5 0
这是我数据框的第二行(类型 1 错误)
> results_2 %>%
+ summarise(across(contains("_p_"), ~ mean(.x > 0.05)))
a_p_ b_p_ c_p_
1 0.75 0.5 0.5
所以我所做的是..
# make empty holder
type1error<-as.data.frame(matrix(nrow = 2))
for(i in 1:2){
# read the data
if(i==1){
results<-results_1
}
if(i==2){
results<-results_2
}
# mean() You can use mean() to get the proportion of TRUE of a logical vector.
type1error[i,]<-results %>%
summarise(across(contains("_p_"), ~ mean(.x > 0.05)))
type1error$conditions[i] <- i
}
但是我收到了这样的警告信息,结果似乎不是我所期望的 (总结每一行的结果)
Warning messages:
1: In `[<-.data.frame`(`*tmp*`, i, , value = list(a_p_ = 0.5, b_p_ = 0.5, :
provided 3 variables to replace 2 variables
2: In `[<-.data.frame`(`*tmp*`, i, , value = list(a_p_ = 0.75, b_p_ = 0.5, :
provided 3 variables to replace 2 variables
我该如何解决这个问题?
你可以
library(tidyverse)
list(results_1, results_2) %>%
map_dfr(. %>% summarise(across(contains("_p_"), ~ mean(.x > 0.05))))
#> a_p_ b_p_ c_p_
#> 1 0.50 0.5 0.0
#> 2 0.75 0.5 0.5
由 reprex package (v2.0.1)
创建于 2022-05-11library(dplyr)
bind_rows(results_1 = results_1, # Skip "X =" if you don't
results_2 = results_2, # need descriptive name
.id = "id") %>%
group_by(id) %>%
summarize(across(contains("_p_"), ~mean(.x>0.05)))
# A tibble: 2 × 4
id a_p_ b_p_ c_p_
<chr> <dbl> <dbl> <dbl>
1 results_1 0.5 0.5 0
2 results_2 0.75 0.5 0.5
如果您已经在 tidyverse
工作,我认为发布的答案更加一致,但这里有一个使用更多基本 R 函数的选项:
dfs <- list(results_1, results_2)
do.call(rbind, lapply(dfs, \(x) summarize(x, across(contains("_p_"), ~ mean(. > 0.05)))))
a_p_ b_p_ c_p_
1 0.50 0.5 0.0
2 0.75 0.5 0.5