我有一个包含多列的数据表。其中一些字符列具有数值测量值/索引,其值中包含类似"12,3"
或"1,02"
的值。小数部分用逗号代替。
我希望遍历这些字符/数字列,并用小数点替换逗号,以进一步进行数据分析。
我很想使用tidyverse
函数和类似gsub
的函数。这是我的许多尝试之一:
chr.cols <- c('Agriculture', 'Industry', 'Service', 'Crops (%)', 'Other (%)',
'Arable (%)', 'Phones (per 1000)', 'Net migration', 'Coastline
(coast/area ratio', 'Pop. Density (per sq. mi.)')
countries_df <- for(y in colnames(countries)) {
gsub(pattern = ",", replacement = ".", x = countries$y)
}
答案 0 :(得分:2)
如果我们不执行任何赋值操作,则不会替换这些值。如果我们要保留原始数据,请创建原始数据集('countries_df')的副本,并使用[[
代替$
countries_df <- countries
for(y in chr.cols) {
countries_df[[y]] <- gsub(pattern = ",", replacement = ".",
x = countries_df[[y]])
}
请注意,此处我们使用的是[[
而不是[
,因此它仍然适用于具有tbl_df
类,data.table
等的数据集。
答案 1 :(得分:1)
一种方法是将两个对sub
的调用嵌套。第一次调用以数千个分隔符为目标,并用逗号替换了点。然后,第二次替换将字符串的末尾定位为可能的小数点。
val <- "1.234.567,123"
gsub(",(?=\\d{3}$)", ".", gsub("\\.", ",", val), perl=TRUE)
[1] "1,234,567.123"
一个更理想的解决方案可能是使用某些R API来利用语言环境格式。
答案 2 :(得分:1)
您将需要将模式替换(gsub
)的结果存储回数据集中(或为最佳实践,存储到新的数据集中)。另外,必须以[row, column]
格式调用列名称,以避免混淆(data$y
可以是您的索引y
或名为y
的列)。
## Duplicating the dataset
countries_modified <- countries
## Looping through the columns
for(y in 1:ncol(countries)) {
countries_modified[, y] <- gsub(pattern = ",", replacement = ".", x = countries[, y])
}