Цикл For для объединения различных переменных в соответствии с шаблоном имени - PullRequest
0 голосов
/ 19 сентября 2018

Мне нужно объединить наборы переменных, заканчивающиеся конкретными символами.Переменные именуются следующим образом (data = df):

id   A_1   A_2   A_3   B_1   B_2   B_3   C_1   C_2   C_3
1    7     2     1     6     7     4     3     9     0
2    8     5     2     9     7     2     1     6     1
3    5     4     0     8     6     4     1     7     0

Теперь, скажем, «объединение» означает, что мне нужны rowMeans для каждого набора переменных, заканчивающихся на _1, на _2 и так далее.

Так что я мог бы сделать именно это:

rowMeans(df[,c("A_1","B_1","C_1")])
rowMeans(df[,c("A_2","B_2","C_2")])
rowMeans(df[,c("A_3","B_3","C_3")])

Проблема в том, что у меня много этих переменных окончаний, и я бы по существу закончил с одной строкой кода на конец.Следовательно, мне было интересно, есть ли более разумный способ сделать то же самое, используя цикл for.

Этот цикл for должен содержать i (1: n) для окончания и шаблон стабильного имени.это "A_", "B_" и "C_", а затем запустить rowMeans().Но так как я не специалист по написанию циклов, я понятия не имею, как мне это сделать на практике.

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Вы можете использовать paste0 с lapply следующим образом:

n_numbers <- 1:3
n_letters <- 1:3 # change here to extend

col_list <- lapply(n_numbers, function(x) paste0(LETTERS[n_letters], "_", x)) #generates the names

dat_list <- lapply(col_list, function(x) dat[x]) # applies subsetting to dat

lapply(dat_list, rowMeans) # rowMeans

# [[1]]
# [1] 5.333333 6.000000 4.666667
# 
# [[2]]
# [1] 6.000000 6.000000 5.666667
# 
# [[3]]
# [1] 1.666667 1.666667 1.333333

Используемые данные:

tt <- "id   A_1   A_2   A_3   B_1   B_2   B_3   C_1   C_2   C_3
1    7     2     1     6     7     4     3     9     0
2    8     5     2     9     7     2     1     6     1
3    5     4     0     8     6     4     1     7     0"

dat <- read.table(text = tt, header = T)
0 голосов
/ 19 сентября 2018

Вы можете сделать это с помощью Tidyverse:

df %>% gather(k,v,-id) %>% 
  mutate(g=substring(k,3)) %>%
  group_by(id,g) %>% summarise(n=mean(v)) %>%
  spread(g,n)
## A tibble: 3 x 4
## Groups:   id [3]
#     id   `1`   `2`   `3`
#  <int> <dbl> <dbl> <dbl>
#1     1  5.33  6     1.67
#2     2  6     6     1.67
#3     3  4.67  5.67  1.33
0 голосов
/ 19 сентября 2018

Мы можем сгенерировать имена столбцов, используя paste0, выбрать их, взять rowMeans из них и добавить их в новый столбец, используя lapply.

n <- 3
df[paste0(1:n, "_mean")] <- lapply(paste0("_", 1:n, "$"), function(x) {
 rowMeans(df[grepl(x, names(df))])
})

df

#  id A_1 A_2 A_3 B_1 B_2 B_3 C_1 C_2 C_3   1_mean   2_mean   3_mean
#1  1   7   2   1   6   7   4   3   9   0 5.333333 6.000000 1.666667
#2  2   8   5   2   9   7   2   1   6   1 6.000000 6.000000 1.666667
#3  3   5   4   0   8   6   4   1   7   0 4.666667 5.666667 1.333333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...