2016-12-22 14 views
3

У меня есть два списка:как вычислить конкретное подмножество в dataframe в г и сохранить вычисление в другом списке

список 1:

id name age 
1 jake 21 
2 ashly 19 
45 lana 18 
51 james 23 
5675 eric 25 

список 2 (тв часы):

id hours 
1 1.1 
1 3 
1 2.5 
45 5.6 
45 3 
51 2 
51 1 
51 2 

Это просто пример, реальные списки очень большие: список 1 - 5000 id, список 2/3/4 - содержит более 1 миллиона строк (а не уникальный идентификатор).

Мне нужно для каждого списка 2 и до вычисления среднего значения/суммы/подсчета для каждого идентификатора и добавления значения в список 1. Обратите внимание, что мне нужен расчет, сохраненный в другом списке с разными номерами строк.

пример:

list 1: 
    id name age tv_average 
    1 jake 21 2.2 
    2 ashly 19 n/a 
    45 lana 18 4.3 
    51 james 23 1.6667 
    5675 eric 25 n/a 

это мои попытки:

for (i in 1:nrow(list2)) { 
    p <- subset(list2,list2$id==i) 
    list2$tv_average[i==list2$id] <- sum(p$hours)/(nrow(p)) 
} 

ошибка: из 22999 строк она работает только на 21713 строк.

+0

Вы должны быть более точным в ваших языковых данных и доля воспроизводимо. Оба эти объекта выглядят так: class 'data.frame', особый тип класса' list'. 'subset()' может работать с кадрами данных, но не в списках. Все это будет очищено, если вы совместно воспроизводите данные, используя 'dput()' или код обмена для создания выборочных данных. [Пожалуйста, прочитайте эту ссылку о том, как сделать хорошие воспроизводимые примеры] (http://stackoverflow.com/q/5963269/903061), а затем отредактируйте свой вопрос, чтобы сделать ваши данные воспроизводимыми. – Gregor

+0

Если вы хотите попробовать больше для решения самостоятельно, похоже, что это простой двухэтапный процесс. 1. Создайте свой средний/сумма/счет для каждого идентификатора в списке 2 - см. FAQ [Как суммировать переменную по группе?] (Http://stackoverflow.com/q/1660124/903061). 2. Присоедините этот результат к вашему списку 1 - см. FAQ [Как объединить данные в R?] (Http://stackoverflow.com/q/1299871/903061). Вы хотите присоединиться к левому кругу в этом случае. – Gregor

+0

Вам не нужно обмениваться реальными данными. Вам просто нужно поделиться данными, которые у вас есть выше ** воспроизводимо **, либо с помощью 'dput()', либо совместно использовать код для создания выборочных данных. ** Пожалуйста, прочитайте ссылку в моем первом комментарии **, чтобы узнать об этом. Кроме того, как я уже сказал, * возможно * у вас есть кадры данных, а не только списки. И подмножество отлично работает с кадрами данных. Я просто не могу точно сказать, потому что ваши данные не воспроизводятся совместно. – Gregor

ответ

2

Попробуйте

#Sample Data 
data1 = structure(list(id = c(1L, 2L, 45L, 51L, 5675L), name = structure(c(3L, 
1L, 5L, 4L, 2L), .Label = c("ashly", "eric", "jake", "james", 
"lana"), class = "factor"), age = c(21L, 19L, 18L, 23L, 25L) 
), .Names = c("id", 
"name", "age"), row.names = c(NA, -5L), class = "data.frame") 

data2 = structure(list(id = c(1L, 1L, 1L, 3L, 45L, 45L, 51L, 51L, 51L, 
53L), hours = c(1.1, 3, 2.5, 10, 5.6, 3, 2, 1, 2, 6)), .Names = c("id", 
"hours"), class = "data.frame", row.names = c(NA, -10L)) 

# Use aggregate to calculate Average, Sum, and Count and Merge 
merge(x = data1, 
     y = aggregate(hours~id, data2, function(x) 
      c(mean = mean(x), 
       sum = sum(x), 
       count = length(x))), 
     by = "id", 
     all.x = TRUE) 
# id name age hours.mean hours.sum hours.count 
#1 1 jake 21 2.200000 6.600000 3.000000 
#2 2 ashly 19   NA  NA   NA 
#3 45 lana 18 4.300000 8.600000 2.000000 
#4 51 james 23 1.666667 5.000000 3.000000 
#5 5675 eric 25   NA  NA   NA 
+0

Использование 'qdap' и выполнение каждого столбца по одному за раз, чтобы сделать окончательный результат, не нужно. Поскольку вы уже используете 'plyr', просто выполните' data1 = plyr :: join (data1, tv_count) '. По умолчанию для 'join' (левое объединение, объединение имен общих столбцов) должно работать нормально. Или вы можете использовать 'base :: merge'. – Gregor

+0

@allinr Пожалуйста, включите в свой ответ объяснение того, что делает ваш код, поэтому он будет более полезен для будущих читателей. – Barker

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

  • Нет связанных вопросов^_^