我需要重新创建非常大的数据框(900多个变量)的原始变量。这是我要执行的操作的一个示例:
dat <- data.frame(
id=c('user1','user2','user3'),
agePanel1=c(20,25,32),
agePanel2=c(21,NA,33),
favColPanel1=c('blue','red','blue'),
favColPanel2=c('red',NA,'red')
)
id agePanel1 agePanel2 favColPanel1 favColPanel2
1 user1 20 21 blue red
2 user2 25 NA red NA
3 user3 32 33 blue red
对于每个变量,我需要创建一个新变量(下面的年龄和favCol),该变量在有面板数据时为NA,否则为第一次面板观察。如果面板数据不完整,则所有面板值均应设置为NA。该示例的结果如下所示:
id age agePanel1 agePanel2 favCol favColPanel1 favColPanel2
1 user1 NA 20 21 NA blue red
2 user2 25 NA NA red NA NA
3 user3 NA 32 33 NA blue red
我开始尝试使用dplyr和tidyr:
mutate(dat, age = ifelse(is.na(test$agePanel2),agePanel1,NA))
我正在努力寻找一种方法来执行循环或使该过程自动化的方法。
这不是您最初问题的最直接解决方案。但是在我看来,长期获取数据是可取的。这样,您想要执行的操作(以及大多数其他操作)就会容易得多。
# required packages
require(dplyr)
require(tidyr)
# get data in long format
dat_long <- dat %>%
gather(key, value, -id) %>%
separate(key, c("key", "panel"), sep = "Panel") %>%
spread(key, value, convert = TRUE) %>%
arrange(id, panel) %>%
group_by(id)
dat_long
## Source: local data frame [6 x 4]
## Groups: id
##
## id panel age favCol
## 1 user1 1 20 blue
## 2 user1 2 21 red
## 3 user2 1 25 red
## 4 user2 2 NA NA
## 5 user3 1 32 blue
## 6 user3 2 33 red
# functon that does desired operation
panel_fct <- function(x){
ifelse(is.na(x[2]), x[1], as(NA, class(x)))
}
# use mutate_each to do desired operation
dat_long %>% summarise_each(funs(panel_fct), -panel)
## Source: local data frame [3 x 3]
##
## id age favCol
## 1 user1 NA NA
## 2 user2 25 red
## 3 user3 NA NA
当然,您可以将最终结果合并回原始数据,但是对于大多数操作而言,最好使用长数据。
dat_long %>% summarise_each(funs(panel_fct), -panel) %>% left_join(dat, by = "id")
## Source: local data frame [3 x 7]
##
## id age favCol agePanel1 agePanel2 favColPanel1 favColPanel2
## 1 user1 NA NA 20 21 blue red
## 2 user2 25 red 25 NA red NA
## 3 user3 NA NA 32 33 blue red
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句