根据R中的特定列名从字符向量中删除逗号

根据R中的特定列名从字符向量中删除逗号,r,gsub,comma,R,Gsub,Comma,我有一个大的数据帧。较小的子集如下所示: structure(list(Date = c("2017-08-12", "2017-08-12", "2017-08-12" ), `Time (sec)` = c("19:01:04", "07:30:18", "04:29:38"), `4+DURATION` = c("26", "58,000", "27"), `4+'000 (AVG)` = c("0.0000", "0.0000", "0.0000"), `15+DURAT

我有一个大的数据帧。较小的子集如下所示:

structure(list(Date = c("2017-08-12", "2017-08-12", "2017-08-12"
  ), `Time (sec)` = c("19:01:04", "07:30:18", "04:29:38"), `4+DURATION` = c("26", 
  "58,000", "27"), `4+'000 (AVG)` = c("0.0000", "0.0000", "0.0000"), 
  `15+DURATION` = c("26", "57,000", "27"), `15+'000 (AVG)` = c("0.0000", 
  "0.0000", "0.0000")), .Names = c("Date", "Time (sec)", "4+DURATION", 
   "4+'000 (AVG)", "15+DURATION", "15+'000 (AVG)"), row.names = 3:5, class = "data.frame")
实际数据帧如下所示:

       Date Time (sec) 4+DURATION 4+'000 (AVG) 15+DURATION 15+'000 (AVG)
3 2017-08-12   19:01:04         26       0.0000          26        0.0000
4 2017-08-12   07:30:18     58,000       0.0000      57,000        0.0000
5 2017-08-12   04:29:38         27       0.0000          27        0.0000
从第3列开始,其余列存储为字符向量。我正在尝试将字符转换为数字。下面是我使用的代码

cols.num <- names(dat[,-c(1:2)])
dat[cols.num] <- sapply(dat[cols.num],as.numeric)
但期望的输出是:

   Date Time (sec) 4+DURATION 4+'000 (AVG) 15+DURATION 15+'000 (AVG)
3 2017-08-12   19:01:04         26       0.0000          26        0.0000
4 2017-08-12   07:30:18      58000       0.0000        57000        0.0000
5 2017-08-12   04:29:38         27       0.0000          27        0.0000

此数据框中的问题是,我不知道哪一列将具有持续时间值,并且具有持续时间值的列名不断更改,从4+持续时间更改为45+持续时间,等等。在将向量转换为数字之前,我想从名称中具有持续时间的所有向量中删除逗号。

A
dplyr
解决方案:

d <- structure(list(Date = c("2017-08-12", "2017-08-12", "2017-08-12"
  ), `Time (sec)` = c("19:01:04", "07:30:18", "04:29:38"), `4+DURATION` = c("26", 
  "58,000", "27"), `4+'000 (AVG)` = c("0.0000", "0.0000", "0.0000"), 
  `15+DURATION` = c("26", "57,000", "27"), `15+'000 (AVG)` = c("0.0000", 
  "0.0000", "0.0000")), .Names = c("Date", "Time (sec)", "4+DURATION", 
   "4+'000 (AVG)", "15+DURATION", "15+'000 (AVG)"), row.names = 3:5, class = "data.frame")
d2 <- d %>% mutate_at(vars(contains('DURATION')), funs(as.numeric(gsub(',', '', .))))
str(d2)

dA
dplyr
解决方案:

d <- structure(list(Date = c("2017-08-12", "2017-08-12", "2017-08-12"
  ), `Time (sec)` = c("19:01:04", "07:30:18", "04:29:38"), `4+DURATION` = c("26", 
  "58,000", "27"), `4+'000 (AVG)` = c("0.0000", "0.0000", "0.0000"), 
  `15+DURATION` = c("26", "57,000", "27"), `15+'000 (AVG)` = c("0.0000", 
  "0.0000", "0.0000")), .Names = c("Date", "Time (sec)", "4+DURATION", 
   "4+'000 (AVG)", "15+DURATION", "15+'000 (AVG)"), row.names = 3:5, class = "data.frame")
d2 <- d %>% mutate_at(vars(contains('DURATION')), funs(as.numeric(gsub(',', '', .))))
str(d2)

d您需要
*将其应用于感兴趣的列,因为
gsub
(仅供参考,
sub
在这里也可以)是未矢量化的,即

df[,unique(grep("DUR", names(df), value=T))] <- 
                     lapply(df[,unique(grep("DUR", names(df), value=T))], function(i) 
                                                          as.numeric(sub(',', '', i)))

您需要
*将其应用于感兴趣的列,因为
gsub
(仅供参考,
sub
在这里也可以)是未矢量化的,即

df[,unique(grep("DUR", names(df), value=T))] <- 
                     lapply(df[,unique(grep("DUR", names(df), value=T))], function(i) 
                                                          as.numeric(sub(',', '', i)))

您需要应用它<代码>gsub
未矢量化
df[,unique(grep(“DUR”,names(df),value=T))]@Sotos谢谢你……明白了。我试着用apply…,遇到了一个永无止境的问题,我可以接受这个答案。你需要
*应用它<代码>gsub
未矢量化
df[,unique(grep(“DUR”,names(df),value=T))]@Sotos谢谢你……明白了。我试着用apply…,遇到了一个永无止境的问题解决方案…可以接受这个答案。你也可以在(vars(contains('DURATION')),~as.numeric(gsub(',','','))上做
变异(mutate_)
,使用最近的
dplyr
pkg版本谢谢你的建议!您还可以在(vars(contains('DURATION'))、~as.numeric(gsub(',','','))
中使用最新的
dplyr
pkg版本执行
mutate_,谢谢您的建议!
       Date Time (sec) 4+DURATION 4+'000 (AVG) 15+DURATION 15+'000 (AVG)
3 2017-08-12   19:01:04         26       0.0000          26        0.0000
4 2017-08-12   07:30:18      58000       0.0000       57000        0.0000
5 2017-08-12   04:29:38         27       0.0000          27        0.0000
#str(df)
#'data.frame':  3 obs. of  6 variables:
# $ Date         : chr  "2017-08-12" "2017-08-12" "2017-08-12"
# $ Time (sec)   : chr  "19:01:04" "07:30:18" "04:29:38"
# $ 4+DURATION   : num  26 58000 27
# $ 4+'000 (AVG) : chr  "0.0000" "0.0000" "0.0000"
# $ 15+DURATION  : num  26 57000 27
# $ 15+'000 (AVG): chr  "0.0000" "0.0000" "0.0000"