NewbieDave
NewbieDave

Reputation: 1259

R $ operator is invalid for atomic vectors

I have a dataset where one of the columns are only "#" sign. I used the following code to remove this column.

ia <- as.data.frame(sapply(ia,gsub,pattern="#",replacement=""))

However, after this operation, one of the integer column I had changed to factor.

I wonder what happened and how can i avoid that. Appreciate it.

Upvotes: 0

Views: 1802

Answers (2)

user3471268
user3471268

Reputation:

Surely if you want to remove an offending column from a data frame, and you know which column it is, you can just subset. So, if it's the first column:

df <- df[,-1]

If it's a later column, increment up.

Upvotes: 0

joran
joran

Reputation: 173577

A more correct version of your code might be something like this:

d <- data.frame(x = as.character(1:5),y = c("a","b","#","c","d"))
> d[] <- lapply(d,gsub,pattern = "#",replace = "")
> d
  x y
1 1 a
2 2 b
3 3  
4 4 c
5 5 d

But as you'll note, this approach will never actually remove the offending column. It's just replacing the # values with empty character strings. To remove a column of all # you might do something like this:

d <- data.frame(x = as.character(1:5),
                y = c("a","b","#","c","d"),
                z = rep("#",5))
> d[,!sapply(d,function(x) all(x == "#"))]
  x y
1 1 a
2 2 b
3 3 #
4 4 c
5 5 d

Upvotes: 2

Related Questions