Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Data Manipulation in R: 'X' must be atomic

I have imported a file with headings and numbers in multiple columns using the following command. irs_data <- read.csv(file="10incyallnoagi.csv")

I would like to divide the values in 1 column by another and then determine the highest 3 values.

     salary_var <- c(irs_data[13]/irs_data[12])
     head(sort(new_var, decreasing=TRUE), 3) 

I keep getting the constant error. As a beginner to R, what does it mean "x must be atomic" in this context.

Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : 
  'x' must be atomic
like image 459
user2657817 Avatar asked Oct 08 '14 00:10

user2657817


2 Answers

you can use the unlist() to convert the list to a vector as the sort() function takes vector form for sorting. so just use

head(sort(unlist(new_var), decreasing=TRUE), 3) 
like image 179
Sameer Sinha Avatar answered Oct 13 '22 09:10

Sameer Sinha


The problem is that salary_var is a list containing a single-element. The call to sort() is then trying to sort a list, not an atomic element. You can see that salary_var is a list by running str(salary_var). If you omit the c(), you'll instead end up with a data frame with a single column, which gives the same problem.

Two simple solutions:

To sort the values in the element of the list, use

head(sort(salary_var[[1]], decreasing=TRUE), 3) 

where the [[1]] selects the first element of the list and sorts the values within it.

Alternatively, create salary_var explicitly as a numeric vector instead:

salary_var <- (irs_data[13]/irs_data[12])[[1]]

One note: in your post, you wrote new_var instead of salary_var in your call to sort() which may confuse other readers.

like image 45
Sean Hughes Avatar answered Oct 13 '22 07:10

Sean Hughes