Цикл по списку для извлечения значения в R - PullRequest
0 голосов
/ 01 мая 2020

Я новичок в программировании на R, пытаюсь написать al oop, чтобы извлечь число из списка, содержащего кадры данных. Тем не менее, я не могу правильно составить список. Это, вероятно, основа c, но сейчас это сводит меня с ума!

df1 <- tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), c=c("alpha", "beta","alpha", "beta", "alpha"))
df2 <- tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), c=c("alpha", "beta","alpha", "beta", "alpha"))
df3 <- tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), c=c("alpha", "beta","alpha", "beta", "alpha"))
df4 <- tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), c=c("alpha", "beta","alpha", "beta", "alpha"))

list <- c(df1, df2, df3, df4)
res  <- vector("numeric",4)
df2[[2,2]]

for (i in list){
res[i] <- i[[2,2]]

}

Я получаю эту (и аналогичную) ошибку; «Ошибка в i [[2, 2]]: неверное количество подписчиков»

Благодарю за любую помощь.

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Полагаю, вы пытаетесь выделить вторую строку второго столбца в каждом кадре данных, который является частью списка:

library(tidyverse)

res <- list(df1 = tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), 
                         c=c("alpha", "beta","alpha", "beta", "alpha")),
            df2 = tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), 
                         c=c("alpha", "beta","alpha", "beta", "alpha")),
            df3 = tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), 
                         c=c("alpha", "beta","alpha", "beta", "alpha")),
            df4 = tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), 
                         c=c("alpha", "beta","alpha", "beta", "alpha"))) %>%
  # if you want the answer in a dataframe
  purrr::map_df(~ .x %>% 
                  dplyr::select(2) %>% # Pick the second column
                  dplyr::slice(2)) %>% # Pick the second row's value

  unlist() # if you want it as a vector
> res
b1 b2 b3 b4 
23 23 23 23 
0 голосов
/ 01 мая 2020

(заранее, я собираюсь использовать mylist вместо list.)

Ваши данные не являются списком фреймов, поскольку вы, похоже, пытаетесь использовать его как.

mylist <- c(df1, df2, df3, df4)
str(mylist)
# List of 12
#  $ a: num [1:5] 1 2 3 4 5
#  $ b: num [1:5] 22 23 24 25 26
#  $ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
#  $ a: num [1:5] 1 2 3 4 5
#  $ b: num [1:5] 22 23 24 25 26
#  $ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
#  $ a: num [1:5] 1 2 3 4 5
#  $ b: num [1:5] 22 23 24 25 26
#  $ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
#  $ a: num [1:5] 1 2 3 4 5
#  $ b: num [1:5] 22 23 24 25 26
#  $ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...

Вместо этого используйте list:

mylist <- list(df1, df2, df3, df4)
str(mylist)
# List of 4
#  $ :Classes 'tbl_df', 'tbl' and 'data.frame': 5 obs. of  3 variables:
#   ..$ a: num [1:5] 1 2 3 4 5
#   ..$ b: num [1:5] 22 23 24 25 26
#   ..$ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
#  $ :Classes 'tbl_df', 'tbl' and 'data.frame': 5 obs. of  3 variables:
#   ..$ a: num [1:5] 1 2 3 4 5
#   ..$ b: num [1:5] 22 23 24 25 26
#   ..$ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
#  $ :Classes 'tbl_df', 'tbl' and 'data.frame': 5 obs. of  3 variables:
#   ..$ a: num [1:5] 1 2 3 4 5
#   ..$ b: num [1:5] 22 23 24 25 26
#   ..$ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
#  $ :Classes 'tbl_df', 'tbl' and 'data.frame': 5 obs. of  3 variables:
#   ..$ a: num [1:5] 1 2 3 4 5
#   ..$ b: num [1:5] 22 23 24 25 26
#   ..$ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
for (i in mylist) { print(i[[2,2]]); break; }
# [1] 23

(Условный for l oop, просто чтобы продемонстрировать, что i[[2,2]] работает в конце концов.)


И к вашему назначению, некоторые рабочие примеры:

res <- sapply(mylist, function(x) x[[2,2]])
res
# [1] 23 23 23 23

### identical results, might be more obscure (and perhaps less flexible)
res <- sapply(mylist, `[[`, c(2, 2))

### identical results, less R-idiomatic
res <- vector("numeric", 4)
for (i in seq_along(mylist)) { res[[i]] <- mylist[[i]][[2,2]]; }
res
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...