假设我有以下数据:

> foo <- data.frame(x=c(1,2,3), y=c("a", "b|c", "d|e|f"))
> foo
  x     y
1 1     a
2 2   b|c
3 3 d|e|f

我想说的是:

> foo_long <- data.frame(x=c(1,2,2,3,3,3), y=c("a", "b", "c", "d", "e", "f"))
> foo_long
  x y
1 1 a
2 2 b
3 2 c
4 3 d
5 3 e
6 3 f

我已经走到了

> foo_long <- foo %>% mutate(y=str_split(y, "\\|"))
> foo_long
  x       y
1 1       a
2 2    b, c
3 3 d, e, f
> str(foo_long)
'data.frame':   3 obs. of  2 variables:
 $ x: num  1 2 3
 $ y:List of 3
  ..$ : chr "a"
  ..$ : chr  "b" "c"
  ..$ : chr  "d" "e" "f"

但y列是向量,我不知道如何从向量中得到值.

EDIT:事实上,到最后我希望达到foo_long2以下,但我认为这是另一个问题.

foo_long2 <- data.frame(x=c(1,2,3),
                        a=c(1,0,0), b=c(0,1,0), c=c(0,1,0),
                        d=c(0,0,1), e=c(0,0,1), f=c(0,0,1))
> foo_long2
  x a b c d e f
1 1 1 0 0 0 0 0
2 2 0 1 1 0 0 0
3 3 0 0 0 1 1 1

推荐答案

在tidyr包中有separate_longer_delim()或更老的separate_rows()功能.

library(tidyr)
foo <- data.frame(x=c(1,2,3), y=c("a", "b|c", "d|e|f"))
separate_longer_delim(foo, y, delim ="|")

  x y
1 1 a
2 2 b
3 2 c
4 3 d
5 3 e
6 3 f

对于第二部分,这里有一个可行的解决方案

separate_longer_delim(foo, y, delim ="|") %>% 
   pivot_wider(names_from = y, values_from= y, values_fn = length, values_fill = 0)

# A tibble: 3 × 7
      x     a     b     c     d     e     f
  <dbl> <int> <int> <int> <int> <int> <int>
1     1     1     0     0     0     0     0
2     2     0     1     1     0     0     0
3     3     0     0     0     1     1     1

R相关问答推荐

判断字符串中数字的连续性

如何在RMarkdown LaTex PDF输出中包含英语和阿拉伯语?

警告:lmdif:info = 0. nls. lm()函数的输入参数不正确

在数学中正确显示摄氏度、开氏度或华氏度

如何在modelsummary中重命名统计数据?

使用strsplit()将向量操作为数据框

移除仪表板Quarto中顶盖和车身之间的白色区域

在使用bslb和bootstrap5时,有没有办法更改特定dt行的 colored颜色 ?

将二进制数据库转换为频率表

Data.table';S GForce-将多个函数应用于多列(带可选参数)

基于数据集属性将科分配给物种

从R中发出的咕噜声中的BUG?

如何创建累加到现有列累计和的新列?

如何移除GGPlot中超出与面相交的任何格网像元

如何将一些单元格的内容随机 Select 到一个数据框中?

观察器中的inaliateLater的位置

创建新列,其中S列的值取决于该行S值是否与其他行冗余

如果满足条件,则替换列的前一个值和后续值

通过匹配另一个表(查找表)中的列值来填充数据表,并在另一个变量上进行内插

R,将组ID分配给另一个观测ID变量中的值的组合