Привязать фрейм данных в списке ко всем остальным фреймам в списке - PullRequest
0 голосов
/ 09 июля 2019

Выложено несколько похожих вопросов, но не совсем то, что я ищу. У меня есть эти данные:

set.seed(34)
startingframe <-  data.frame(
  group1=factor(rep(c("a","b","c"),each=3,times=1)),
  time=rep(1:3,each=1,times=3),
  othercolumn=rnorm(1:9)
)
startingframe$control <- ifelse(startingframe$group1 == "c", 1, 0)
startingframe

out <- split(startingframe, startingframe$group1)
out

С этими данными я хочу программно привязать контрольную группу (group1 = c или control = 1) к обеим группам лечения, с выводом точно так, как показано ниже:

list(
rbind(out[[1]], out[[3]]),
rbind(out[[2]], out[[3]]))

[[1]]
  group1 time othercolumn control
1      a    1  -0.1388900       0
2      a    2   1.1998129       0
3      a    3  -0.7477224       0
7      c    1   0.6706200       1
8      c    2  -0.8490146       1
9      c    3   1.0668045       1

[[2]]
  group1 time othercolumn control
4      b    1  -0.5752482       0
5      b    2  -0.2635815       0
6      b    3  -0.4554921       0
7      c    1   0.6706200       1
8      c    2  -0.8490146       1
9      c    3   1.0668045       1

В идеале это можно сделать с помощью фильтра контрольных флагов (control = 1), а не явно через переменную group1 (в случае изменения количества групп лечения).

Ответы [ 3 ]

2 голосов
/ 09 июля 2019

Вот подход tidyverse, хотя group_map является экспериментальным:

library(tidyverse)
control_group_df <- startingframe %>% filter(control == 1)

startingframe %>%
    filter(control != 1) %>%
    group_by(group1) %>%
    group_map(~ bind_rows(., control_group_df), keep = TRUE)
1 голос
/ 09 июля 2019

Опция базового R

# removing factors because in the vast majority of cases (incl this one) they make life harder
startingframe$group1 <- as.character(startingframe$group1)

control_split <- split(startingframe, startingframe$control)

lapply(split(control_split[['0']], control_split[['0']]$group1),
       rbind, control_split[['1']])



# $`a`
#   group1 time othercolumn control
# 1      a    1  -0.1388900       0
# 2      a    2   1.1998129       0
# 3      a    3  -0.7477224       0
# 7      c    1   0.6706200       1
# 8      c    2  -0.8490146       1
# 9      c    3   1.0668045       1
# 
# $b
#   group1 time othercolumn control
# 4      b    1  -0.5752482       0
# 5      b    2  -0.2635815       0
# 6      b    3  -0.4554921       0
# 7      c    1   0.6706200       1
# 8      c    2  -0.8490146       1
# 9      c    3   1.0668045       1
0 голосов
/ 09 июля 2019

Почему не просто list два rbind с?

list(do.call(rbind, out[c(1, 3)]), do.call(rbind, out[c(2, 3)]))

Или вообще избегать out кадра.

with(startingframe, list(
  rbind(startingframe[group1 == "a", ], startingframe[group1 == "c", ]),
  rbind(startingframe[group1 == "b", ], startingframe[group1 == "c", ])))

# [[1]]
#     group1 time othercolumn control
# a.1      a    1  -0.1388900       0
# a.2      a    2   1.1998129       0
# a.3      a    3  -0.7477224       0
# c.7      c    1   0.6706200       1
# c.8      c    2  -0.8490146       1
# c.9      c    3   1.0668045       1
# 
# [[2]]
#     group1 time othercolumn control
# b.4      b    1  -0.5752482       0
# b.5      b    2  -0.2635815       0
# b.6      b    3  -0.4554921       0
# c.7      c    1   0.6706200       1
# c.8      c    2  -0.8490146       1
# c.9      c    3   1.0668045       1
...