#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) суммами всех строк каждого фрейма данных. Я пробовал с суммами строк, но для этого требуется массив, и я застрял.