Applying gsub to various columns

拜拜、爱过 提交于 2020-01-10 18:44:31

问题


What is the most efficient way to apply gsub to various columns? The following does not work

x1=c("10%","20%","30%")
x2=c("60%","50%","40%")
x3 = c(1,2,3)
x = data.frame(x1,x2,x3)
per_col = c(1,2)
x = gsub("%","",x[,per_col])

How can I most efficiently drop the "%" sign in specified columns. Can I apply it to the whole dataframe? This would be useful in the case where I don't know where the percentage columns are.


回答1:


You can use apply to apply it to the whole data.frame

apply(x, 2, function(y) as.numeric(gsub("%", "", y)))
     x1 x2 x3
[1,] 10 60  1
[2,] 20 50  2
[3,] 30 40  3



回答2:


Or, you could try the lapply solution:

as.data.frame(lapply(x, function(y) gsub("%", "", y)))

  x1 x2 x3
1 10 60  1
2 20 50  2
3 30 40  3



回答3:


The first answer works but be careful if you are using data.frame with string: the @docendo discimus's answer will return NAs.

If you want to keep the content of your column as string just remove the as.numeric and convert your table into a data frame after :

as.data.frame(apply(x, 2, function(y) as.numeric(gsub("%", "", y))))
     x1 x2 x3
[1,] 10 60  1
[2,] 20 50  2
[3,] 30 40  3



回答4:


To clean the % out you can do:

x[per_col] <- lapply(x[per_col], function(y) as.numeric(gsub("%", "", y)))

x
  x1 x2 x3
1 10 60  1
2 20 50  2
3 30 40  3



回答5:


To add on docendo discimus' answer, an extension with non-adjacent columns and returning a data.frame:

x1 <- c("10%", "20%", "30%")
x2 <- c("60%", "50%", "40%")
x3 <- c(1, 2, 3)
x4 <- c("60%", "50%", "40%")

x <- data.frame(x1, x2, x3, x4)

x[, c(1:2, 4)] <- as.data.frame(apply(x[,c(1:2, 4)], 2,
                                         function(x) {
                                           as.numeric(gsub("%", "", x))}
))

> x
  x1 x2 x3 x4
1 10 60  1 60
2 20 50  2 50
3 30 40  3 40

> class(x)
[1] "data.frame"


来源:https://stackoverflow.com/questions/23831237/applying-gsub-to-various-columns

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!