2016-06-01 3 views
0

У меня есть список dt с той же структурой, некоторые столбцы: numericcharacters.как привязать к одному столбцу в списке таблиц данных

dt1 <- data.table(x = c(1:5), y = "test") 
dt2 <- data.table(x = c(1:5), y = "test") 
mylist <- list(A = dt1, B = dt2) 

Я хочу, чтобы применить функцию, скажем, sum или mean, которые не могут быть применены по всему DataTable, потому что есть некоторые character колонны.

Я пробовал различные комбинации lapply(mylist$y,sum) или lapply(mylist[2],sum), но это не сработало.

+3

Просьба представить воспроизводимый пример (с использованием действительного синтаксиса) и показать желаемый результат. – Roland

+0

Имеет ли, например, 'lapply (mylist, function (i) sum (i [,. (X)]))' дать желаемый результат? – Jaap

+0

@ProcrastinatusMaximus да, он делает! –

ответ

3

вы можете создать анонимную функцию внутри lapply, в которой вы подмножество и выполнить необходимые вычисления (поощрение мой комментарий к ответу):

lapply(mylist, function(i) i[, sum(x)]) 
# or: 
lapply(mylist, function(i) sum(i[["x"]])) 

, который дает:

$A 
[1] 76 

$B 
[1] 99 

Другой пример дает вам ряд уникальных у-значений для x > 3:

lapply(mylist, function(i) i[x>3, uniqueN(y)]) 

, который дает:

$A 
[1] 10 

$B 
[1] 14 

Б данные:

dt1 <- data.table(x = c(1:5), y = letters) 
dt2 <- data.table(x = c(1:7), y = letters) 
mylist <- list(A = dt1, B = dt2) 
+0

Я бы предпочел 'lapply (mylist, function (i) i [, sum (x)])' или 'lapply (mylist, function (i) sum (i [[" x "]]))'. – Roland

+0

@Roland Я думаю, что это более ясно. Есть ли способ объединить другую операцию, например, деление или умножение? –

+0

@Roland Thanx, это действительно лучший способ. Исправлено сейчас. – Jaap

1

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

library(purrr) 
dt1 <- data_frame(x = c(1:5), y = letters[1:5]) 
dt2 <- data_frame(x = c(1:5), y = letters[1:5]) 
mylist <- list(A = dt1, B = dt2) 

map(mylist, "y") %>% 
    map(length) 

Вы также можете использовать что-то вроде этого, чтобы применить функцию условно

map(mylist, ~map_if(., is.numeric, sum)) 
+0

ОК, похоже, работает, слишком плохо, мне приходится полагаться на внешний пакет. Вы знаете, как подмножество основано на каждой таблице данных в списке на основе значения, например x> 3 в моем случае. –

+0

Yup, вы можете использовать любую функцию предиката в 'map_if', вам просто нужно будет назвать ее анонимной функцией или определить ее в другом месте. 'purrr' - довольно хороший внешний пакет для использования, в основном потому, что он имеет безопасные типы альтернатив семейству функций. – Shorpy

-1

Вы также можете использовать вложенные lapply() функции следующим образом:

dt1 <- data.table(x = c(1:5), y = letters[1:5]) 
dt2 <- data.table(x = c(6:10), y = letters[1:5]) 
mylist <- list(A = dt1, B = dt2) 

lapply(lapply(mylist, function(x) x[[1]]), mean) 

# $A 
# [1] 3 

# $B 
# [1] 8 

Много вариантов здесь она выглядит. С моим кодом, может быть интересно посмотреть, что возвращает lapply(), и как другой lapply() справляется с этим, чтобы понять, почему он работает.

+0

да много хороших примеров, что именно делает [[1]] в вашем примере? –

+0

Это расточительное (и медленное для больших списков). – Roland

+0

Я не уверен в полной семантике '[[]]' скобок в R, но я использую их для выбора i-го элемента списка. 'mylist [[2]]' даст второй элемент, используемый для создания 'mylist'. Я согласен с тем, что это расточительно и непрактично, но я обнаружил, что он помогает мне понять, что делает программа на самом деле. На практике большинство других методов было бы более уместным. –

Смежные вопросы