用“。”代替“,”。跨数据框的多个列值

时间:2018-12-14 01:43:52

标签: r

我有一个包含多列的数据表。其中一些字符列具有数值测量值/索引,其值中包含类似"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)
     }

3 个答案:

答案 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])
}