Извлечение определенных столбцов из списка фреймов данных с помощью функции и lapply

#r #list #function #lapply

#r #Список #функция #lapply

Вопрос:

У меня есть список фреймов данных с именем StatesList (это список состояний), и я пытаюсь извлечь два столбца из каждого, просуммировать его и вернуть суммы. Это то, что у меня есть до сих пор:

 StatesList <- list(Alabam, Alask, Arizon, Arkansa, Californi, Colorado, Connecticu, Delawar, District_ColUmbi, Florid, Georgi, Hawai, Idah, Illinoi, Indian, Iow, Kansa, Kentuck, Louisian, Main, Marylan, Massachusett, Michiga, Minnesot, Mississipp, Missour, Montan, Nebrask, Nevad, New_Hamp, New_Jer, New_Mex, New_York, North_Carol, North_Dak, Ohi, Oklahom, Orego, Pennsylvani, Rhode_Isl, South_Carol, South_Dak, Tennesse, Texa, Uta,Vermon, Virgini, Washingto, West_Vir, Wisconsi, Wyomin )

my_function <- function(x) {

  c <- sum(x   $Clinton_Weighted)
  t <- sum(x   $Trump_Weighted)
  ans <- list(Clinton = c, Trump = t)
  return(print(ans))
}

lapply(StatesList, my_function(x))
  

Я знаю, что x $Clinton_Weighted это не сработает, но я не уверен, что сработает.
Как мне извлечь этот конкретный столбец из кода функции? И является ли попытка объединить имена каждого списка с $ и нужным столбцом плохой идеей?

Комментарии:

1. Я думаю, что да, если попарная сумма всех столбцов означает сумму двух столбцов из каждого состояния, распечатанного в списке.

2. Извините, я не совсем уверен, что вы подразумеваете под этим кодом. (Я не очень разбираюсь в R) Но желаемый результат будет выглядеть примерно так: [1] #for alabama Clinton Trump 87.5 78.4 [2] #for alaska Clinton Trump 67.5 98.4 . . . вплоть до списка состояний. Помогает ли это?

3. [1] #for alabama Clinton Trump 57.5, 48.4 [2] #for alaska Clinton Trump 27.5, 68.4 . . . где числа — это суммы столбцов внутри фреймов данных внутри списка.

4. Достаточно справедливо, извините за это. Я попытаюсь выяснить, как это сделать, и приведу пример здесь.

5. Являются ли два столбца, которые вы рассматриваете для sum , одинаковыми во всех состояниях, если да, вы могли бы передать имя столбца функции как, my_function <- function(x="Alabama",colName1="alpha") { c <- sum(x[,colName1] x[,"Clinton_Weighted"] ...) }

Ответ №1:

Вот простой способ сделать это, используя комбинацию lapply и apply :

 # Create sample data
cols = list(Clinton = 1:10, Trump = 10:1, SomeoneElse = 21:30)

Alabama = data.frame(cols)
Alaska = data.frame(cols)
Arison = data.frame(cols)
Arkansa = data.frame(cols)
Californi = data.frame(cols)

df_list = list(Alabama, Alaska, Arison, Arkansa, Californi)
  

Список фреймов данных выглядит следующим образом:

 df_list
[[1]]
   Clinton Trump SomeoneElse
1        1    10          21
2        2     9          22
3        3     8          23
4        4     7          24
5        5     6          25
6        6     5          26
7        7     4          27
8        8     3          28
9        9     2          29
10      10     1          30

[[2]]
   Clinton Trump SomeoneElse
1        1    10          21
2        2     9          22
3        3     8          23
4        4     7          24
5        5     6          25
6        6     5          26
7        7     4          27
8        8     3          28
9        9     2          29
10      10     1          30

[[3]]
   Clinton Trump SomeoneElse
1        1    10          21
2        2     9          22
3        3     8          23
4        4     7          24
5        5     6          25
6        6     5          26
7        7     4          27
8        8     3          28
9        9     2          29
10      10     1          30

[[4]]
   Clinton Trump SomeoneElse
1        1    10          21
2        2     9          22
3        3     8          23
4        4     7          24
5        5     6          25
6        6     5          26
7        7     4          27
8        8     3          28
9        9     2          29
10      10     1          30

[[5]]
   Clinton Trump SomeoneElse
1        1    10          21
2        2     9          22
3        3     8          23
4        4     7          24
5        5     6          25
6        6     5          26
7        7     4          27
8        8     3          28
9        9     2          29
10      10     1          30
  

Теперь суммируйте столбцы фрейма данных и примените его к списку фреймов данных:

 # Choose the columns to extract the sum of
cols = c("Clinton", "Trump")

lapply(df_list, function(x) apply(x[cols], 2, sum))
  

Ниже приведен возвращенный список

 [[1]]
Clinton   Trump 
     55      55 

[[2]]
Clinton   Trump 
     55      55 

[[3]]
Clinton   Trump 
     55      55 

[[4]]
Clinton   Trump 
     55      55 

[[5]]
Clinton   Trump 
     55      55 
  

Комментарии:

1. @Travasaurus Это желаемый результат?

2. Что, если я хотел бы получить сумму каждого фрейма данных, но в виде векторов с (10×1) суммами всех строк каждого фрейма данных. Я пробовал с суммами строк, но для этого требуется массив, и я застрял.