折叠同一列中来自多列的相同字符串

时间:2019-06-21 15:41:06

标签: r

我需要将嵌套数据集重组为一个平面数据集。

我的数据集如下:

UserID   Test
<p>A &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X
<p>A &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y
<p>A &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Z
<p>B &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y
<p>B &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Z

每个用户完成了不同数量的测试,并且他们的顺序是任意的。 X,Y和Z代表统一的字符串测试名称。

我需要它看起来像这样:

UserID &nbsp;X &nbsp;&nbsp; Y &nbsp;&nbsp; Z 
<p>A &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 &nbsp;&nbsp; 1 &nbsp;&nbsp; 1 &nbsp;&nbsp;
<p>B &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 &nbsp;&nbsp; 1 &nbsp;&nbsp; 1 &nbsp;&nbsp;

1-完成测试; 0-未完成测试。

换句话说,我需要执行某种标记,但是要从多列(而不是单个字符串)中进行。

对于如何实现此目标的任何建议,我将不胜感激。谢谢!

我使用UserId作为标识符转换了数据集,但结果数据集的列数与任何用户最大数量的已完成测试(这很好)一样,但是相同的测试在用户中未对齐(例如,第一列用于用户A之所以包含X,是因为用户A首先完成了测试X,而用户B则是Y,原因是用户未完成测试X,或者未按照相同的顺序完成测试。

1 个答案:

答案 0 :(得分:0)

一个选项是

library(dplyr)
library(tidyr)
df1 %>%
  extract(Test, into = c("Test", "colNm"), sep= "(.*);[^;]+$") %>%
  mutate(colNm = str_c(colNm, "&nbsp", sep="_")) %>%
  group_by(UserID) %>%
  mutate(rn = row_number()) %>%      
  spread(colNm, Test)