Как назначить список в качестве наблюдения в таблице данных? - PullRequest
0 голосов
/ 20 ноября 2018

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

library(data.table)
library(stringr)

DT = data.table(strings = c('AAABD', 'BBDA', 'AACBDAA', 'ABACD'))

Я хотел бы создать переменную, которая будет содержать подсчеты 'A', 'AA' и 'AAA' в каждом наблюдении каксписок.Для этого я создал функцию foo:

foo <- function(str) {
    n <- str_count(str, 'A')
    n2 <- str_count(str, 'AA')
    n3 <- str_count(str, 'AAA')
    df <- list('n' = n, 'n2' = n2, 'n3' = n3)

    return(df)
}

Я применяю эту функцию к DT, чтобы создать новую переменную для наблюдения за количеством в виде списка:

DT[, count := foo(strings)]

Когда я это делаю, Я получаю эту ошибку:

Warning message:
In `[.data.table`(DT, , `:=`(counts, foo(strings))) :
  Supplied 3 items to be assigned to 4 items of column 'counts' (recycled leaving remainder of 1 items).

Возвращенная таблица данных содержит списки переменных подсчета размера 4 вместо размера 3 и не точно отражает количество 'A', 'AA' и 'AAA'для каждой строки наблюдения в переменной strings.Как я могу назначить список в качестве наблюдения в таблице данных?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вам нужно transpose list:

foo <- function(str) {
  n <- str_count(str, 'A')
  n2 <- str_count(str, 'AA')
  n3 <- str_count(str, 'AAA')
  df <- transpose(list('n' = n, 'n2' = n2, 'n3' = n3)) # <- add transpose 
  return(df)
}

DT[, count := foo(strings)]
DT
#     strings count
#  1:   AAABD 3,1,1
#  2:    BBDA 1,0,0
#  3: AACBDAA 4,2,0
#  4:   ABACD 2,0,0

str(DT)
# Classes ‘data.table’ and 'data.frame':    4 obs. of  2 variables:
# $ strings: chr  "AAABD" "BBDA" "AACBDAA" "ABACD"
# $ count  :List of 4
#  ..$ : int  3 1 1
#  ..$ : int  1 0 0
#  ..$ : int  4 2 0
#  ..$ : int  2 0 0
0 голосов
/ 20 ноября 2018

Присвоение списка столбцов одному имени может привести к появлению предупреждающего сообщения. Вместо этого это может быть

DT[, c('n', 'n2', 'n3') := .(str_count(strings, 'A'), 
        str_count(strings, 'AA'),  str_count(strings, 'AAA'))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...