Работа с сгруппированными данными в R - PullRequest
3 голосов
/ 10 января 2012

Если у меня есть набор данных в R, который выглядит следующим образом:

ProjName,ProjLevel,Budget
Proj1,Hardware,$100
,Software,$100
,Total,$200
Proj2,Hardware,$200
,Software,$300
,Other,$400
,Total,$900
...
...

И я хочу, чтобы данные выглядели так:

ProjName,ProjLevel,Budget
Proj1,Hardware,$100
Proj1,Software,$100
Proj1,Total,$200
Proj2,Hardware,$200
Proj2,Software,$300
Proj2,Other,$400
Proj2,Total,$900

Я не уверен, что это лучший подход. В идеале, я хотел бы, чтобы "Общая" сумма бюджета для каждого проекта. Я подумал, что, может быть, я смогу использовать apply () в столбце, но не уверен, что это лучший способ решить задачу.

Спасибо, Prao

Ответы [ 2 ]

3 голосов
/ 10 января 2012

Если вы читаете данные, используя na.strings = "", вы можете использовать функцию na.locf в пакете zoo , чтобы заполнить пропущенные значения самым последним не пропущенным:

my.table <-read.table(text="ProjName,ProjLevel,Budget
+ Proj1,Hardware,$100
+ ,Software,$100
+ ,Total,$200
+ Proj2,Hardware,$200
+ ,Software,$300
+ ,Other,$400
+ ,Total,$900", header=TRUE, as.is=TRUE,sep = ",",na.strings = "")

my.table$ProjName <- na.locf(my.table$ProjName)
> my.table
  ProjName ProjLevel Budget
1    Proj1  Hardware   $100
2    Proj1  Software   $100
3    Proj1     Total   $200
4    Proj2  Hardware   $200
5    Proj2  Software   $300
6    Proj2     Other   $400
7    Proj2     Total   $900
3 голосов
/ 10 января 2012

Без использования дополнительных пакетов я бы использовал цикл и заменял пустые ячейки предыдущей непустой ячейкой

my.table <-read.table(text="ProjName,ProjLevel,Budget
Proj1,Hardware,$100
,Software,$100
,Total,$200
Proj2,Hardware,$200
,Software,$300
,Other,$400
,Total,$900", header=TRUE, as.is=TRUE,sep = ",")

for (i in 1:nrow(my.table)){
if(my.table[i,1]=="") my.table[i,1] <-my.table[i-1,1]
}

дает:

> my.table
  ProjName ProjLevel Budget
1    Proj1  Hardware   $100
2    Proj1  Software   $100
3    Proj1     Total   $200
4    Proj2  Hardware   $200
5    Proj2  Software   $300
6    Proj2     Other   $400
7    Proj2     Total   $900

Чтобы получить общую сумму по проекту:

my.table[my.table$ProjLevel=="Total",]

  ProjName ProjLevel Budget
3    Proj1     Total   $200
7    Proj2     Total   $900
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...