在给定r中的相应向量的情况下替换数据帧中的列

时间:2014-12-30 07:01:51

标签: r dataframe

我正在寻找一种更快捷的方法来替换带有数字的R数据帧中的星期几。从本质上讲,我想知道的问题是给出一个向量,并且相应的向量可以快速地将替换应用于数据帧。

这是我的数据框:

   month day_of_week  skies
 1   APR     Tuesday Clear 
 2   APR   Wednesday Cloudy
 3   APR    Thursday Cloudy
 4   APR      Friday Cloudy
 5   APR    Saturday Cloudy
 6   APR      Sunday Clear 

一周的日期在以下向量中:

 daysweek <- unique(df$day_of_week)
 daysweek
 [1] Tuesday   Wednesday Thursday  Friday    Saturday  Sunday    Monday

相应的矢量是:

 days_num <- c(2,3,4,5,6,7,1)

我要做的很多方法是没有相应的向量并单独使用gsub。我想知道是否有一个快速的方法来做到这一点。我无法用for循环解决这个问题。

for (i in c(1:7)) {
  df$result <- gsub(daysweek[i], days_num[i], df$day_of_week)
}

我想要的数据帧输出是:

   month day_of_week  skies
 1   APR     2       Clear 
 2   APR     3       Cloudy
 3   APR     4       Cloudy
 4   APR     5       Cloudy
 5   APR     6       Cloudy
 6   APR     7       Clear 

1 个答案:

答案 0 :(得分:2)

使用index列创建weekdays matchday_of_week

Date <- as.Date('2014-12-29') #Monday 
Wdays <- weekdays(seq(Date, length.out=7, by= '1 day'))

df[,2] <- match(df[,2],Wdays)
df[,2] 
#[1] 2 3 4 5 6 7

或者您可以将列转换为factor,其级别从MondaySunday,并将其转换为numeric

as.numeric(factor(df$day_of_week, levels=c("Monday", "Tuesday",
    "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")))
#[1] 2 3 4 5 6 7

更新

如果您的vector数字索引与unique列中的day_of_week值相对应

Un <- c('Tuesday',   'Wednesday', 'Thursday',  'Friday',   
        'Saturday',  'Sunday',    'Monday')
days_num <- c(2,3,4,5,6,7,1)
set.seed(24)
day_of_week <- sample(Un, 20, replace=TRUE)
unname(setNames(days_num, Un)[day_of_week])
#[1] 4 3 6 5 6 1 3 7 7 3 6 4 6 6 4 1 3 2 5 2

由于您使用了gsub,因此来自mgsub的其他选项为qdap

 library(qdap)
 as.numeric(mgsub(Un, days_num, day_of_week))
 #[1] 4 3 6 5 6 1 3 7 7 3 6 4 6 6 4 1 3 2 5 2

library(qdapTools)
day_of_week %l% data.frame(Un, days_num)
 #[1] 4 3 6 5 6 1 3 7 7 3 6 4 6 6 4 1 3 2 5 2