我有一個如下的資料框。變數 a 和 b 是連續的,變數 v1-v7 是二進制的。
> df <- data.frame(a= c(1,1,2,3,5),
b = c(3, 6,8, 2, 4),
v1 = c(0,0,0,0,0),
v2 = c(1,0,0,0,0),
v3 = c(0,1,1,1,1),
v4 = c(0,1,1,1,1),
v5 = c(0,0,0,0,1),
v6 = c(0,0,0,0,0),
v7 = c(0,0,0,0,0))
> df
a b v1 v2 v3 v4 v5 v6 v7
1 1 3 0 1 0 0 0 0 0
2 1 6 0 0 1 1 0 0 0
3 2 8 0 0 1 1 0 0 0
4 3 2 0 0 1 1 0 0 0
5 5 4 0 0 1 1 1 0 0
>
我想根據上面顯示的資料框創建七個子樣本。具體來說,我想制作七個僅包含變數 a 和 b 并且每個 v1-v7 等于 1 的子樣本。例如,
> df1 <- df %>% filter(v1==1)
> df1
[1] a b v1 v2 v3 v4 v5 v6 v7
<0 rows> (or 0-length row.names)
> df2 <- df %>% filter(v2==1)
> df2
a b v1 v2 v3 v4 v5 v6 v7
1 1 3 0 1 0 0 0 0 0
> df3 <- df %>% filter(v3==1)
> df3
a b v1 v2 v3 v4 v5 v6 v7
1 1 6 0 0 1 1 0 0 0
2 2 8 0 0 1 1 0 0 0
3 3 2 0 0 1 1 0 0 0
4 5 4 0 0 1 1 1 0 0
我想知道如何在 R 中同時執行這些操作?謝謝。
uj5u.com熱心網友回復:
這是一種方法lapply()
。您最好將結果保存在串列中。子樣本v1
將是subsamples[[1]]
等等。-
subsamples <- lapply(3:9, function(x) df[df[[x]]==1, ])
subsamples
[[1]]
[1] a b v1 v2 v3 v4 v5 v6 v7
<0 rows> (or 0-length row.names)
[[2]]
a b v1 v2 v3 v4 v5 v6 v7
1 1 3 0 1 0 0 0 0 0
[[3]]
a b v1 v2 v3 v4 v5 v6 v7
2 1 6 0 0 1 1 0 0 0
3 2 8 0 0 1 1 0 0 0
4 3 2 0 0 1 1 0 0 0
5 5 4 0 0 1 1 1 0 0
[[4]]
a b v1 v2 v3 v4 v5 v6 v7
2 1 6 0 0 1 1 0 0 0
3 2 8 0 0 1 1 0 0 0
4 3 2 0 0 1 1 0 0 0
5 5 4 0 0 1 1 1 0 0
[[5]]
a b v1 v2 v3 v4 v5 v6 v7
5 5 4 0 0 1 1 1 0 0
[[6]]
[1] a b v1 v2 v3 v4 v5 v6 v7
<0 rows> (or 0-length row.names)
[[7]]
[1] a b v1 v2 v3 v4 v5 v6 v7
<0 rows> (or 0-length row.names)
uj5u.com熱心網友回復:
只需將列“v1”回圈到“v7”并執行filter
并回傳list
library(dplyr)
library(stringr)
library(purrr)
lst1 <- str_subset(names(df), "^v\\d ") %>%
map(~ df %>%
filter(if_all(all_of(.x), ~ .x == 1)))
names(lst1) <- str_c('df', seq_along(lst1))
最好將其保存在list
. 如果我們需要在全域環境中創建的物件(不推薦),請使用list2env
命名的list
list2env(lst1, .GlobalEnv)
uj5u.com熱心網友回復:
在 dplyr 中,您可以使用代詞將變數名稱指定為字串.data
(請參閱資料掩碼)
df_samples <- list()
for(i in 1:7)
df_samples[[i]] <- filter(df, .data[[paste0("v", i)]] == 1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515280.html
下一篇:將for回圈應用于變數的不同級別