используйте dplyr для суммирования первого элемента вложенного списка (2-й массив?) - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь понять правильное использование dplyr при суммировании вложенного списка в таблице.

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

> glimpse(mydata)
Rows: 1,000
Columns: 3
$ meta                 <df[,6]> <data.frame[40 x 6]>
$ independent_variable <list> [<"A", "B", "B", "B", "A", "A", "B", "A…
$ dependent_variables  <df[,4]> <data.frame[40 x 4]>


> head(mydata$independent_variable)
[[1]]
      [,1]        [,2]    [,3] [,4]
 [1,] "A" "FALSE" "5" NA  
 [2,] "B"  "FALSE" "5" "NA"
 [3,] "B"  "FALSE" "5" "NA"
 [4,] "B"  "FALSE" "5" "NA"
 [5,] "A"  "FALSE" "13" "NA"
 [6,] "A"  "FALSE" "5" "NA"
 [7,] "B"  "FALSE" "12" "NA" 
 [8,] "A"  "FALSE" "133 "NA"
 [9,] "A"  "FALSE" "131 "NA"
[10,] "A"  "TRUE"  "0"  "NA" 

[[2]]
     [,1]        [,2]    [,3] [,4] 
[1,] "A" "FALSE" "77" NA   
[2,] "B"  "FALSE" NA   "NA"
[3,] "B"  "FALSE" NA   "NA" 
[4,] "B"  "FALSE" NA   "NA" 
[5,] "B"  "FALSE" NA   "NA"
[6,] "A"  "TRUE"  "1"  "NA"

переменная independent_variable представляет собой 1000 записей из N x 4 списков (то есть, все 1000 записей имеют 4 столбца и различное количество строк. Первый столбец - единственный столбец, который в данный момент заинтересован в просмотре, и каждый элемент может быть только "A" или "B") , Я хочу посчитать количество «А» в каждой из 1000 и вернуть это значение для каждой из 1000 записей.

кажется, что я должен использовать purrr, но я не уверен, как структурировать это в dplyr

1 Ответ

1 голос
/ 14 апреля 2020

Вот подход с использованием purrr:

library(purrr)
library(dplyr)

# my example data
tmp = list(cbind(c("A","A","B"),1),cbind(c("B","A","B"),2))

# define a summary function
count_A = function(x){
  x %>%
    as.data.frame() %>% # needed as the input data is of type 'matrix'
    select(V1) %>%      # the default column name for column 1
    filter(V1 == "A") %>%
    ungroup() %>%       # unnecessary, but clear you are summarising the whole df
    summarise(num_A = n())
}

# test summary function
count_A(tmp[[1]])

# apply function to every element of list
map(tmp, count_A)

В этом шаблоне ваша функция сводки может быть любой функцией, которая принимает один аргумент и возвращает желаемый результат. Если функция работает правильно при применении к первому элементу списка (см. В коде, я проверяю мою функцию сводки), то можно ожидать, что map будет применять функцию ко всем элементам списка.

...