R:将多列数据帧中的多个值替换为另一列中的值

时间:2015-10-06 12:33:45

标签: r

我正在努力实现与thisthis问题类似的功能,但我不想替换为单个值,而是根据另一列替换。

数据来自具有“是”的特定网站。当在特定日期进行测量时,我现在想要在那些特定日期的河水位。我的数据看起来像这样(但有更多的网站和日期):

date <- c('2000-01-01','2000-01-02','2000-01-03','2000-01-04','2000-01-05','2000-01-06','2000-01-07','2000-01-08','2000-01-09','2000-01-10')
date <- as.Date(date)
Site1 <- c('yes','','yes','','yes','','yes','','','')
Site2 <- c('yes','yes','yes','','','','','yes','','yes')
Site3 <- c('','','','','','','yes','yes','','yes')
waterlevel <- c(24,58,2,38,18,59,20,98,16,88)
df <- data.frame(date,Site1,Site2,Site3,waterlevel)

给出了这个数据帧:

         date Site1 Site2 Site3 waterlevel
1  2000-01-01   yes   yes               24
2  2000-01-02         yes               58
3  2000-01-03   yes   yes                2
4  2000-01-04                           38
5  2000-01-05   yes                     18
6  2000-01-06                           59
7  2000-01-07   yes         yes         20
8  2000-01-08         yes   yes         98
9  2000-01-09                           16
10 2000-01-10         yes   yes         88

我希望输出数据框看起来像这样:

         date Site1 Site2 Site3 waterlevel
1  2000-01-01   24   24              24
2  2000-01-02        58              58
3  2000-01-03    2    2               2
4  2000-01-04                        38
5  2000-01-05   18                   18
6  2000-01-06                        59
7  2000-01-07   20         20        20
8  2000-01-08         98   98        98
9  2000-01-09                        16
10 2000-01-10         88   88        88

我尝试使用上述问题的解决方案代码,并在不同的数据框中使用水位匹配参数,但解决方案不起作用:

sel <- grepl("Site",names(df))
df[sel] <- lapply(df[sel], function(x) replace(x,x %in% 2:4, df2$waterlevel[match(df$date,df2$date)]) )

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

df[sel] <- lapply(df[sel], 
                  function(x, value) ifelse(x == "yes", value, NA), 
                  value = df$waterlevel)

#         date Site1 Site2 Site3 waterlevel
#1  2000-01-01    24    24    NA         24
#2  2000-01-02    NA    58    NA         58
#3  2000-01-03     2     2    NA          2
#4  2000-01-04    NA    NA    NA         38
#5  2000-01-05    18    NA    NA         18
#6  2000-01-06    NA    NA    NA         59
#7  2000-01-07    20    NA    20         20
#8  2000-01-08    NA    98    98         98
#9  2000-01-09    NA    NA    NA         16
#10 2000-01-10    NA    88    88         88

答案 1 :(得分:2)

使用data.table包。这里更容易处理长格式和昏迷再到宽格式(原始格式)。

dcast(date+waterlevel~variable,   ## put again in the wide format
       data=melt(setDT(df),id=c("date","waterlevel"))[ ## long format
       value=="yes",value:=waterlevel]) ## filter and process one variable

         date waterlevel Site1 Site2 Site3
 1: 2000-01-01         24    24    24      
 2: 2000-01-02         58          58      
 3: 2000-01-03          2     2     2      
 4: 2000-01-04         38                  
 5: 2000-01-05         18    18            
 6: 2000-01-06         59                  
 7: 2000-01-07         20    20          20
 8: 2000-01-08         98          98    98
 9: 2000-01-09         16                  
10: 2000-01-10         88          88    88

答案 2 :(得分:0)

使用dplyr,您可以执行以下操作:

library("dplyr")
df <- df %>% 
  mutate_at(vars(starts_with("Site")),
            function(x) ifelse(x == "yes", .$waterlevel, x))

df
#          date Site1 Site2 Site3 waterlevel
# 1  2000-01-01    24    24               24
# 2  2000-01-02          58               58
# 3  2000-01-03     2     2                2
# 4  2000-01-04                           38
# 5  2000-01-05    18                     18
# 6  2000-01-06                           59
# 7  2000-01-07    20          20         20
# 8  2000-01-08          98    98         98
# 9  2000-01-09                           16
# 10 2000-01-10          88    88         88