在一个包含多个单词的列中计算唯一单词的数量

4
如果我有几列包含因素内的多个单词(用“,”分隔)的单元格。如何获得每列唯一单词列表?例如:
    var1 | var2 | var3
    a,b  | a,b  | a,c
    a,x  | b,s  | d,s
    a,d  | b,m  | e,m

我希望你能够以列表/数据框的形式提供结果:
```

而且我希望结果以列表/数据框的形式呈现:

```
      var1     |   var2     |   var3
    [a,b,d,x]  | [a,b,s,m]  | [a,c,d,s,e,m]
2个回答

5

您可以在lapply语句中使用strsplit+unique来完成此操作:

lapply(mydf, function(x) unique(trimws(unlist(strsplit(x, ",")))))
## $var1
## [1] "a" "b" "x" "d"
## 
## $var2
## [1] "a" "b" "s" "m"
## 
## $var3
## [1] "a" "c" "d" "s" "e" "m"
## 

如果你想得到一个字符串作为结果,可以添加toString函数,然后用data.frame包装整个代码块,以获取data.frame而不是list

data.frame(lapply(mydf, function(x) toString(unique(trimws(unlist(strsplit(x, ",")))))))
##         var1       var2             var3
## 1 a, b, x, d a, b, s, m a, c, d, s, e, m

如果您确实需要方括号和“单词”之间没有空格,那么可以使用 sprintf + paste。假设我们已将第一个 lapply 语句的列表输出存储为“temp”,请尝试:

lapply(temp, function(x) sprintf("[%s]", paste(x, collapse = ",")))
## $var1
## [1] "[a,b,x,d]"
## 
## $var2
## [1] "[a,b,s,m]"
## 
## $var3
## [1] "[a,c,d,s,e,m]"
## 

trimws对我来说是新的。得记住这个! - thelatemail
非常感谢!如果每列的元素属于不同的类,例如var_1是字符类型,而var_2是日期类型,但是所有列都使用“,”进行分隔。是否有类似于“strsplit”的东西? - Wenkai Ying

1
这是一个整洁的方法来完成它:

library(dplyr)

data = 
  data_frame(
    var1 = list(c("a", "b"),
                c("a", "x") ),
    var2 = list(c("a", "b"),
                c("b", "s") ) )

long_data = 
  data %>%
  as.list %>%
  lapply(. %>% 
           lapply(. %>% 
                    data_frame(value = .) ) %>%
           bind_rows(.id = "row") ) %>%
  bind_rows(.id = "column") %>%
  group_by(column, row) %>%
  mutate(order = 1:n() )

long_data %>%
  select(-row) %>%
  distinct

看起来OP的数据集中列元素是字符串,而不是基于“以逗号分隔”的列表。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接