2016-12-07 2 views
1

У меня есть кадр данных с 2 столбцами, первый - это идентификационный номер, а второй - список чисел. Я определил функцию, которая суммирует список и добавляет 2. То, что я хотел бы сделать, - это выполнить вычисления для всех строк без использования цикла for. Я попытался с помощью применить, но я не могу заставить его работать ...Применить функцию к столбцу кадра данных (столбец - это список)

Вот код:

Фрейм данных испытаний:

d1 <- c(1,2,3,4,5) 
d2 <- c(4,6,8) 
d3 <- c(5,10) 

df1 <- data.frame(cbind(1, I(list(d1)))) 
df2 <- data.frame(cbind(2, I(list(d2)))) 
df3 <- data.frame(cbind(3, I(list(d3)))) 
df <- rbind(df1, df2, df3) 

Определенная функция sum2:

sum2 <- function(a) 
{ 
    sum(unlist(a)) + 2 
} 

Как я могу применить заявку и добавить третий столбец в df, содержащий рассчитанное значение?

Спасибо!

+0

Почему вы предпочитаете ' sapply' над циклом? Они оба являются петлями. Разве вы не хотите более чистого синтаксиса? –

+0

Я думал, что смогу сделать это более эффективно ... Есть ли лучший способ сделать это? – jormaga

+0

Не думаю, что сейчас один, извините. Если 'X2' содержал строки, такие как' "4, 6, 8" 'вместо списков, вы могли бы легко векторизовать это, но я не уверен, как векторизовать ваш конкретный формат. –

ответ

4

следующие работы для примера

sapply(df[,2], function(x) sum(x)+2) 
1

Мы можем использовать sapply

df$NewCol <- sapply(df$X2, function(x) sum(x) + 2) 

Или используя функцию OP, но unlist не требуется

sapply(df$X2, sum2) 
+1

Спасибо большое !!! :) – jormaga