根据 R 中的特定列名从字符向量中删除逗号
Remove commas from character vectors based on specific column names in R
我有一个大数据框。较小的子集如下:
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)
dat 是我的数据框。这会强制两个持续时间列中的 NA 值,其中字符值中有一个额外的逗号。
我试图通过
删除它
df[,unique(grep("DUR", names(df), value=T))] <- gsub(",","",df[,unique(grep("DUR", names(df), value=T))])
但这会创建一个像这样的 df
Date Time (sec) 4+DURATION 4+'000 (AVG) 15+DURATION 15+'000 (AVG)
3 2017-08-12 19:01:04 c("26" "58000" "27") 0.0000 c("26" "57000" "27") 0.0000
4 2017-08-12 07:30:18 c("26" "57000" "27") 0.0000 c("26" "58000" "27") 0.0000
5 2017-08-12 04:29:38 c("26" "58000" "27") 0.0000 c("26" "57000" "27") 0.0000
但期望的输出是:
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+DURATION 到 45+DURATION 等。我想删除在将矢量应用到数字之前,所有名称中带有 DURATION 的矢量的逗号。
一个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)
您需要 *apply
它到感兴趣的列,因为 gsub
(仅供参考,sub
在这里也很好)是 NOT矢量化,即
df[,unique(grep("DUR", names(df), value=T))] <-
lapply(df[,unique(grep("DUR", names(df), value=T))], function(i)
as.numeric(sub(',', '', i)))
这给出了,
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"
我有一个大数据框。较小的子集如下:
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)
dat 是我的数据框。这会强制两个持续时间列中的 NA 值,其中字符值中有一个额外的逗号。
我试图通过
删除它df[,unique(grep("DUR", names(df), value=T))] <- gsub(",","",df[,unique(grep("DUR", names(df), value=T))])
但这会创建一个像这样的 df
Date Time (sec) 4+DURATION 4+'000 (AVG) 15+DURATION 15+'000 (AVG)
3 2017-08-12 19:01:04 c("26" "58000" "27") 0.0000 c("26" "57000" "27") 0.0000
4 2017-08-12 07:30:18 c("26" "57000" "27") 0.0000 c("26" "58000" "27") 0.0000
5 2017-08-12 04:29:38 c("26" "58000" "27") 0.0000 c("26" "57000" "27") 0.0000
但期望的输出是:
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+DURATION 到 45+DURATION 等。我想删除在将矢量应用到数字之前,所有名称中带有 DURATION 的矢量的逗号。
一个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)
您需要 *apply
它到感兴趣的列,因为 gsub
(仅供参考,sub
在这里也很好)是 NOT矢量化,即
df[,unique(grep("DUR", names(df), value=T))] <-
lapply(df[,unique(grep("DUR", names(df), value=T))], function(i)
as.numeric(sub(',', '', i)))
这给出了,
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"