R语言 我想在列之间匹配相似的单词

yquaqz18  于 2023-04-18  发布在  其他
关注(0)|答案(4)|浏览(106)
1.02.03.0
大声的抱怨问题
疼痛应力糊涂
无光泽的疼痛应力

这是我的数据集,我想重新组织行,以便如果每列中出现一个单词,则将其转移到相应的行。例如
| 1.0 |2.0|3.0|
| --------------|--------------|--------------|
| 大声的|不适用|不适用|
| 疼痛|疼痛|不适用|
| 无光泽的|不适用|不适用|
| 不适用|抱怨|不适用|
| 不适用|应力|应力|
| 不适用|不适用|糊涂|
| 不适用|不适用|问题|
等等,这样每个单词都有自己的一行,如果该行中的单词出现在该列中,它就会与其他列匹配
我一直在寻找如何做到这一点,但找不到好的代码。我的一个想法是创建一个所有出现的单词列表,然后尝试将它们与每一列相匹配,但仍然没有找到这方面的代码。

6ie5vjzr

6ie5vjzr1#

我们可以在base R中使用match-从unlist艾德数据中获取unique元素作为vector,循环列,获取匹配元素的索引,以及replace匹配元素的索引,并在处理长度后转换为 Dataframe 。

v1 <- unique(unlist(df1))
lst1 <- lapply(df1, \(x) 
   {i1 <- match(x, v1)
   replace(rep(NA, max(i1)), i1, v1[i1])
 })
list2DF(lapply(lst1, `length<-`, max(lengths(lst1))))
 1.0       2.0      3.0
1 loud      <NA>     <NA>
2 pain      pain     <NA>
3 dull      <NA>     <NA>
4 <NA> complaint     <NA>
5 <NA>    stress   stress
6 <NA>      <NA> problems
7 <NA>      <NA> confused

数据

df1 <- structure(list(`1.0` = c("loud", "pain", "dull"), `2.0` = c("complaint", 
"stress", "pain"), `3.0` = c("problems", "confused", "stress"
)), class = "data.frame", row.names = c(NA, -3L))
egdjgwm8

egdjgwm82#

这是一个tidyverse版本。

suppressMessages(library(tidyverse))
x = tibble(`1.0` = c("loud", "pain", "dull"),
           `2.0` = c("complaint", "stress", "pain"),
           `3.0` = c("problems", "confused", "stress"))

x %>% 
  gather("version", "value") %>% 
  mutate(id = value) %>% 
  spread(version, value) %>% 
  select(-id)
#> # A tibble: 7 x 3
#>   `1.0` `2.0`     `3.0`   
#>   <chr> <chr>     <chr>   
#> 1 <NA>  complaint <NA>    
#> 2 <NA>  <NA>      confused
#> 3 dull  <NA>      <NA>    
#> 4 loud  <NA>      <NA>    
#> 5 pain  pain      <NA>    
#> 6 <NA>  <NA>      problems
#> 7 <NA>  stress    stress

reprex package(v2.0.0)于2023-04-11创建
如果需要按出现顺序排列行,可以将第二个语句更改为

mutate(id = fct_inorder(value)) %>%

注意:gatherspread函数被pivot_longerpivot_wider函数取代。在我看来,旧的函数更容易使用,在这种情况下已经足够好了。新的函数功能更强大。

shyt4zoc

shyt4zoc3#

快速+高效的数据表解决方案:

x <- data.table(`1.0` = c("loud", "pain", "dull"),
           `2.0` = c("complaint", "stress", "pain"),
           `3.0` = c("problems", "confused", "stress"))

dcast(unique(melt(x, measure.vars = names(x))), value ~ variable)

       value  1.0       2.0      3.0
1: complaint <NA> complaint     <NA>
2:  confused <NA>      <NA> confused
3:      dull dull      <NA>     <NA>
4:      loud loud      <NA>     <NA>
5:      pain pain      pain     <NA>
6:  problems <NA>      <NA> problems
7:    stress <NA>    stress   stress
xurqigkl

xurqigkl4#

下面是使用stack + reshape的基本R选项

reshape(
  transform(stack(df), v = values),
  direction = "wide",
  idvar = "values",
  timevar = "ind"
)[-1]

它给出了

v.x1      v.x2     v.x3
1 loud      <NA>     <NA>
2 pain      pain     <NA>
3 dull      <NA>     <NA>
4 <NA> complaint     <NA>
5 <NA>    stress   stress
7 <NA>      <NA> problems
8 <NA>      <NA> confused

数据

> dput(df)
structure(list(x1 = c("loud", "pain", "dull"), x2 = c("complaint", 
"stress", "pain"), x3 = c("problems", "confused", "stress")), class = "data.frame", row.names = c(NA,
-3L))

相关问题