сохранить вывод в вектор в R? - PullRequest
1 голос
/ 01 апреля 2019

У меня есть следующая функция, которая находит различное количество случаев, относящихся к 4 различным факторам. test - список, содержащий 4 dataframes

for (i in test){
  i<-i%>%distinct(FileNumber)%>%nrow()
  print(i)
}

когда я запускаю это, я получаю следующий вывод

[1] 38
[1] 129
[1] 1868
[1] 277

Однако я хочу, чтобы этот вывод был сохранен в другом векторе my_vector. Так что my_vector это

38 129 1868 277

Итак, я попробовал следующее, основываясь на этом ответе, который нашел Сохранение результатов цикла for как вектора в r

library(dplyr)

my_vector<-vector("numeric",4L)

for (i in test){
  my_vector[i]<-i%>%distinct(FileNumber)%>%nrow()
}

Однако, когда я запускаю это, я получаю следующее сообщение

Error in my_vector[i] <- i %>% distinct(FileNumber) %>% nrow() : 
  invalid subscript type 'list'

Как получить ранее сохраненный вывод, сохраненный в векторе?

Ответы [ 3 ]

1 голос
/ 01 апреля 2019

Вы пытаетесь проиндексировать my_vector с помощью list -подобного объекта.

Например:

mylist <- list(mtcars, mtcars)
myvec <- numeric(length(mylist))
for (i in mylist) {
  myvec[i] <- nrow(distinct(i, cyl))
}

На первой (и второй в этом примере) итерации i является фреймом, поэтому myvec[i] эквивалентно myvec[mtcars], что не имеет смысла.

Вместо этого выполните цикл по индексу списка кадров, ala:

library(dplyr)
mylist <- list(mtcars, mtcars)
myvec <- numeric(length(mylist))
for (i in seq_len(length(mylist))) {
  myvec[i] <- test[[i]] %>% distinct(cyl) %>% nrow()
}
myvec
# [1] 3 3

или просто сделайте что-то вроде:

sapply(mylist, function(l) l %>% distinct(cyl) %>% nrow())
# [1] 3 3

Кстати: это так же просто в base-R с:

sapply(mylist, function(l) length(unique(l[["cyl"]])))
# [1] 3 3
1 голос
/ 01 апреля 2019

Это должно работать со списком фреймов данных или матриц

d <- list(a = matrix(rnorm(100), nrow = 20),
            b = matrix(rnorm(100), nrow = 10),
            c = matrix(rnorm(100), nrow = 50))

my_vect <- c()
for (i in seq_along(d)){
  n <- nrow(d[[i]]) 
  my_vect[i] <- n
}

my_vect 
[1] 20 10 50
0 голосов
/ 01 апреля 2019

Используйте unlist(), и если это не сработает, тогда добавьте as.vector() в свой канал:

for (i in test){
  i<-i %>% distinct(FileNumber) %>% nrow() %>% unlist()
  print(i)
}

Если это не является вектором, тогда:

for (i in test){
  i<-i %>% distinct(FileNumber) %>% nrow() %>% unlist() %>% as.vector()
  print(i)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...