Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert AsIs to numeric separated by coma in data frame

Tags:

r

I have such data frame:

structure(list(P1 = c("Mark", "Katrin", "Kate", "Hank", "Tom", 
"Marcus"), P2 = c("Tim", "Greg", "Seba", "Teqa", "Justine", "Monica"
), clique = structure(list(`930` = integer(0), `2090` = integer(0), 
    `3120` = c(2L, 3L, 231L), `3663` = integer(0), `3704` = integer(0), 
    `4156` = c(19L, 27L)), .Names = c("930", "2090", "3120", 
"3663", "3704", "4156"), class = "AsIs")), .Names = c("P1", "P2", 
"clique"), row.names = c(930L, 2090L, 3120L, 3663L, 3704L, 4156L
), class = "data.frame")

And I have a problem with the last column called clique. I would like to convert this column to numeric values separated by come in one column or the best option would be to transform integer(0) to NAs and put the numbers in separate columns. Just keep one number in each column. I will accept both solutions.

example data:

P1  P2  clique
Mark    Tim integer(0)
Katrin  Greg    integer(0)
Kate    Seba    c(2, 3, 231)
Hank    Teqa    integer(0)
Tom Justine integer(0)
Marcus  Monica  c(19, 27)

> class(data$clique)
[1] "AsIs"

Desired output:

 P1      P2    clique
Mark     Tim      NA    
Katrin   Greg     NA    
Kate     Seba    2,3,231
Hank     Teqa     NA
Tom      Justine  NA    
Marcus   Monica  19,27

or

P1      P2    clique New_column1 New_column2
Mark    Tim          
Katrin  Greg          
Kate    Seba      2        3          231
Hank    Teqa          
Tom     Justine          
Marcus  Monica    19       27
like image 943
Shaxi Liver Avatar asked Feb 11 '26 10:02

Shaxi Liver


1 Answers

You can try listCol_w from my "splitstackshape" package:

library(splitstackshape)
listCol_w(mydf, "clique")[, lapply(.SD, as.numeric), by = .(P1, P2)]
##        P1      P2 clique_fl_1 clique_fl_2 clique_fl_3
## 1:   Mark     Tim          NA          NA          NA
## 2: Katrin    Greg          NA          NA          NA
## 3:   Kate    Seba           2           3         231
## 4:   Hank    Teqa          NA          NA          NA
## 5:    Tom Justine          NA          NA          NA
## 6: Marcus  Monica          19          27          NA

I recommend this because you mentioned you wanted the numeric values. You won't be able to store a value like "2,3,231" as a numeric value.

If you still want to try the approach of collapsing the values and then splitting them, you can try:

mydf$clique <- vapply(mydf$clique, function(x) paste(x, collapse = ","), character(1L))

The str would show that you now have a single character string instead of a list of character vectors. You can then use cSplit on that to get the wide form.

> str(mydf)
'data.frame':   6 obs. of  3 variables:
 $ P1    : chr  "Mark" "Katrin" "Kate" "Hank" ...
 $ P2    : chr  "Tim" "Greg" "Seba" "Teqa" ...
 $ clique: chr  "" "" "2,3,231" "" ...
like image 158
A5C1D2H2I1M1N2O1R2T1 Avatar answered Feb 15 '26 18:02

A5C1D2H2I1M1N2O1R2T1



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!