R: могут ли извлеченные строки быть сохранены в один столбец как отдельные символы? - PullRequest
1 голос
/ 26 марта 2020

Позвольте мне просто сказать, что мне нужно назначать классы людям на основе предложений из строки комментария. (фактические данные более сложны, чем это, и я упростил их). Таким образом, я извлек строки из предложений комментариев из данных, используя регулярные выражения с remathces (), gsub () и gregexpr (). Затем сохраните список в столбцы и объедините их в виде символов, как показано ниже.

>cbind.data.frame(level,software,month,stringsAsFactors = FALSE) 

   level                         software             month
1  c("beginner1","beginner2")    c++                  Dec       
2                      NA        Java                 Jan       
3             "beginner3"        NA                   May   
4         "intermediate2"        NA                   NA      
5                      NA        Matlab               Mar    
6             "advanced1"        c("java","c++")      Jul     

и я бы хотел поместить все символы в один столбец с помощью

, разбив список c ("beginner1", "beginner2") на "beginner1", "beginner2 "

-пропадание NA

- остается символом, как показано ниже

  newcol
 "beginner1","beginner2","c++","Dec" 
 "Java","Jan" 
 "beginner3", "May"
 "intermediate2" 
 "Matlab", "Mar"    
 "advanced1","java","c++","Jul"  

ОДНАКО, когда я комбинировал, он был объединен в один символ.

> newcol<-unite(combined, newcol, 1:ncol(combined), remove=TRUE, sep = ",")

 "beginner1,beginner2,c++,Dec"  
 "Java,Jan" 
 "beginner3, May"
 "intermediate2" 
 "Matlab, Mar"    
 "advanced1,java,c++,Jul"  

Можно ли сохранить несколько символов в одном столбце как отдельные символы?

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Вот базовое решение R с использованием

f <- Vectorize(function(u) {
  z <- unlist(regmatches(u,gregexpr('\".*?\"',u,perl = T)))
  if (length(z)> 0) {
    r <- gsub('\"',"",z)
  } else {
    r <- u
  }
  r
})

df$newcol <- apply(df,1,function(x) f(na.omit(x)))

таким, что

> df
                       level        software month                         newcol
1 c("beginner1","beginner2")             c++   Dec beginner1, beginner2, c++, Dec
2                       <NA>            Java   Jan                      Java, Jan
3                  beginner3            <NA>   May                 beginner3, May
4              intermediate2            <NA>  <NA>                  intermediate2
5                       <NA>          Matlab   Mar                    Matlab, Mar
6                  advanced1 c("java","c++")   Jul      advanced1, java, c++, Jul

, где

> df$newcol
$`1`
$`1`$level
[1] "beginner1" "beginner2"

$`1`$software
[1] "c++"

$`1`$month
[1] "Dec"


$`2`
$`2`$software
[1] "Java"

$`2`$month
[1] "Jan"


$`3`
$`3`$level
[1] "beginner3"

$`3`$month
[1] "May"


$`4`
$`4`$level
[1] "intermediate2"


$`5`
$`5`$software
[1] "Matlab"

$`5`$month
[1] "Mar"


$`6`
$`6`$level
[1] "advanced1"

$`6`$software
[1] "java" "c++" 

$`6`$month
[1] "Jul"

DATA

df <- structure(list(level = c("c(\"beginner1\",\"beginner2\")", NA, 
"beginner3", "intermediate2", NA, "advanced1"), software = c("c++", 
"Java", NA, NA, "Matlab", "c(\"java\",\"c++\")"), month = c("Dec", 
"Jan", "May", NA, "Mar", "Jul")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))
1 голос
/ 26 марта 2020

Помогает ли это?

A<-data.frame(a=c("a","b","c"),b=c("a","b","c"),c=c("a","b","c"))

apply(A,2,paste,collapse=",")
...