2016-08-01 6 views
0

У меня есть dataframe (dtetags.df) со столбцом даты, которая имеет много дубликатов даты:Ошибка при консолидации, как строки с plyr - что я делаю неправильно?

dtetags.df$Date 
"2016-07-22" "2016-07-22" "2016-07-21" "2016-07-21" "2016-07-20" "2016-07-20" "2016-07-19" "2016-07-19" "2016-07-18" "2016-07-18" "2016-07-15" "2016-07-15" "2016-07-15" "2016-07-14" 
"2016-07-14" "2016-07-13" "2016-07-13" "2016-07-13" "2016-07-12" "2016-07-12" "2016-07-12" "2016-07-12" "2016-07-11" "2016-07-11" "2016-07-11" "2016-07-11" "2016-07-08" "2016-07-08" 
"2016-07-08" "2016-07-07" "2016-07-07" "2016-07-07" "2016-07-07" "2016-07-06" "2016-07-06" "2016-07-05" "2016-07-05" "2016-07-05" "2016-07-05" "2016-07-01" "2016-07-01" "2016-06-30" 
"2016-06-30" "2016-06-29" "2016-06-29" "2016-06-29" "2016-06-29" "2016-06-29" "2016-06-28" "2016-06-28" "2016-06-28" "2016-06-27" "2016-06-27" "2016-06-27" "2016-06-24" "2016-06-24" 
"2016-06-23" "2016-06-23" "2016-06-22" "2016-06-22" "2016-06-21" "2016-06-21" "2016-06-20" "2016-06-20" "2016-06-17" "2016-06-17" "2016-06-16" "2016-06-16" "2016-06-15" "2016-06-15" 
"2016-06-14" "2016-06-13" "2016-06-13" "2016-06-10" "2016-06-10" "2016-06-09" "2016-06-09" "2016-06-09" "2016-06-09" "2016-06-08" "2016-06-08" "2016-06-07" "2016-06-07" "2016-06-06" 
"2016-06-06" "2016-06-06" "2016-06-01" "2016-06-01" "2016-05-29" "2016-05-29" "2016-05-27" "2016-05-27" "2016-05-26" "2016-05-26" "2016-05-25" "2016-05-25" "2016-05-24" "2016-05-23" 
"2016-05-23" "2016-05-20" 

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

dtetags.df$Technology 
"0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "1" "0" "0" "0" "0" "1" "1" "0" "1" "0" "1" 
"0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "1" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "1" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" 
"0" "0" "0" "0" "0" "0" "0" "0" "0" "0" 

, и я пытаюсь использовать ddply(dtetags.df,"Date",numcolwise(sum)) основанный на this question но он возвращает сообщение об ошибке <0 rows> (or 0-length row.names). Я пробовал несколько разных способов форматировать команду ddply, но я не могу заставить ее работать.

Идеальный выход будет выглядеть так:

   Date   Technology 
1  2016-07-22      0 
2  2016-07-21      0 
3  2016-07-20      0 
4  2016-07-19      0 
5  2016-07-18      0 
6  2016-07-15      0 
7  2016-07-14      0 
8  2016-07-13      0 
9  2016-07-12      0 
10  2016-07-11      0 
11  2016-07-08      0 
12  2016-07-07      0 
13  2016-07-06      1 
14  2016-07-05      0 
15  2016-07-01      2 
16  2016-06-30      1 
17  2016-06-29      1 
18  2016-06-28      0 
19  2016-06-27      0 
20  2016-06-24      1 
21  2016-06-23      0 
22  2016-06-22      0 
23  2016-06-21      0 
24  2016-06-20      0 
25  2016-06-17      0 
26  2016-06-16      0 
27  2016-06-15      0 
28  2016-06-14      1 
29  2016-06-13      0 
30  2016-06-10      0 
31  2016-06-09      0 
32  2016-06-08      0 
33  2016-06-07      0 
34  2016-06-06      0 
35  2016-06-01      0 
36  2016-05-29      0 
37  2016-05-27      0 
38  2016-05-26      0 
39  2016-05-25      0 
40  2016-05-24      0 
41  2016-05-23      0 
42  2016-05-20      0 

Есть ли что-то очевидно, что я делаю неправильно?

Преобразование фактор в числовой

Я удалил столбец Date, применяется data.frame(apply(dtetags.df, 2, function(x) as.numeric(as.character(x)))) к остальной части кадра данных, и предваряется столбца Дата обратно.

dput(dtetags.df) 
structure(list(Date = c("2016-07-22", "2016-07-22", "2016-07-21", 
"2016-07-21", "2016-07-20", "2016-07-20", "2016-07-19", "2016-07-19", 
"2016-07-18", "2016-07-18", "2016-07-15", "2016-07-15", "2016-07-15", 
"2016-07-14", "2016-07-14", "2016-07-13", "2016-07-13", "2016-07-13", 
"2016-07-12", "2016-07-12", "2016-07-12", "2016-07-12", "2016-07-11", 
"2016-07-11", "2016-07-11", "2016-07-11", "2016-07-08", "2016-07-08", 
"2016-07-08", "2016-07-07", "2016-07-07", "2016-07-07", "2016-07-07", 
"2016-07-06", "2016-07-06", "2016-07-05", "2016-07-05", "2016-07-05", 
"2016-07-05", "2016-07-01", "2016-07-01", "2016-06-30", "2016-06-30", 
"2016-06-29", "2016-06-29", "2016-06-29", "2016-06-29", "2016-06-29", 
"2016-06-28", "2016-06-28", "2016-06-28", "2016-06-27", "2016-06-27", 
"2016-06-27", "2016-06-24", "2016-06-24", "2016-06-23", "2016-06-23", 
"2016-06-22", "2016-06-22", "2016-06-21", "2016-06-21", "2016-06-20", 
"2016-06-20", "2016-06-17", "2016-06-17", "2016-06-16", "2016-06-16", 
"2016-06-15", "2016-06-15", "2016-06-14", "2016-06-13", "2016-06-13", 
"2016-06-10", "2016-06-10", "2016-06-09", "2016-06-09", "2016-06-09", 
"2016-06-09", "2016-06-08", "2016-06-08", "2016-06-07", "2016-06-07", 
"2016-06-06", "2016-06-06", "2016-06-06", "2016-06-01", "2016-06-01", 
"2016-05-29", "2016-05-29", "2016-05-27", "2016-05-27", "2016-05-26", 
"2016-05-26", "2016-05-25", "2016-05-25", "2016-05-24", "2016-05-23", 
"2016-05-23", "2016-05-20"), `Technology` = c(0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("Date", 
"Technology"), class = c("tbl_df", "tbl", "data.frame" 
), row.names = c(NA, -100L)) 
+3

Просьба показать воспроизводимый небольшой пример с использованием 'dput' и ожидаемого вывода – akrun

+0

. Ваш ввод и ожидаемый результат, похоже, имеют разные значения. Возможно, 'library (dplyr); dtetags.df%>% group_by (Date)%>% mutate (new = row_number() * as.numeric (as.character (Technology)))' – akrun

+0

Есть ли обобщаемое решение? Это то, что я пытался сделать, не указав столбец. Кроме того, я немного смущен о том, что вы имеете в виду о разных входах/выходах. Благодаря! – arebearit

ответ

0

Чтобы сделать то, что вы хотите, вы можете использовать dplyr пакет:

library(dplyr) 
out <- dtetags.df %>% group_by(Date) %>% summarise_each(funs(sum)) %>% arrange(desc(Date)) 

Примечания:

  1. group_by в Date, что означает, что последующая операция будет над группой строк с той же датой.
  2. Функция sum Функция суммирования каждого столбца (кроме Date).
  3. Используйте arrange, чтобы отсортировать результаты по убывающей по дате.

С учетом входных данных, вывод, как и ожидалось:

print(out) 
# A tibble: 42 x 2 
    Date  Technology 
    <chr>   <dbl> 
1 2016-07-22   0 
2 2016-07-21   0 
3 2016-07-20   0 
4 2016-07-19   0 
5 2016-07-18   0 
6 2016-07-15   0 
7 2016-07-14   0 
8 2016-07-13   0 
9 2016-07-12   0 
10 2016-07-11   0 
11 2016-07-08   0 
12 2016-07-07   0 
13 2016-07-06   1 
14 2016-07-05   0 
15 2016-07-01   2 
16 2016-06-30   1 
17 2016-06-29   1 
18 2016-06-28   0 
19 2016-06-27   0 
20 2016-06-24   1 
21 2016-06-23   0 
22 2016-06-22   0 
23 2016-06-21   0 
24 2016-06-20   0 
25 2016-06-17   0 
26 2016-06-16   0 
27 2016-06-15   0 
28 2016-06-14   1 
29 2016-06-13   0 
30 2016-06-10   0 
31 2016-06-09   0 
32 2016-06-08   0 
33 2016-06-07   0 
34 2016-06-06   0 
35 2016-06-01   0 
36 2016-05-29   0 
37 2016-05-27   0 
38 2016-05-26   0 
39 2016-05-25   0 
40 2016-05-24   0 
41 2016-05-23   0 
42 2016-05-20   0 

предостережений: это требует, чтобы все другие, чем в Datedtetags.df строк numeric. Если это не так, то они должны быть преобразованы до применения этого кода. Это можно сделать, используя ответ найденный here

Надеюсь, что это поможет.