首页 > 解决方案 > 如何根据 R 中的内容重塑字符向量?

问题描述

我有一系列字符向量,其中每个参与者(在 ReprEx 中表示为一个字母)都有一个时间点(在 RePrex 中为 1 或 2),然后是一个分数。这是ReprEx:

l <- c("A","1","27","B","1","26","2","54")

如何重塑向量以创建具有三列的数据框,其中 A 列作为参与者,B 列作为时间点,C 列作为分数?

预期的输出应该是这样的:

data.frame("Participant" = c("A","B","B"),
           "Time Point" = c("1","1","2"),
           "Score" = c("27","26","54"))

如果更容易制作,它可以变成这个形状:

data.frame("Participant" = c("A","B"),
           "TimePoint1" = c("27","26"),
           "TimePoint2" = c("NA","54"))

任何方向/想法表示赞赏。

标签: rtidyr

解决方案


这是基础 R 中的一种方法。

根据Participant名称中的一些模式,我们可以使用grep. 在共享的示例中,模式是每个Participant都有一个大写字母。我们使用他们的位置来split获取数据,因此每个Participant人都有自己的列表。我们将每个列表中的第一个值用作Participant名称,并将备用值分别用作Time.pointScore

output <- do.call(rbind, lapply(split(l, 
             findInterval(seq_along(l), grep('[A-Z]', l))), function(x) {
             data.frame(Participant = x[1], 
                         Time.Point = x[-1][c(TRUE, FALSE)], 
                         Score = x[-1][c(FALSE, TRUE)])
         }))
rownames(output) <- NULL
output <- type.convert(output)
output

#  Participant Time.Point Score
#1           A          1    27
#2           B          1    26
#3           B          2    54

推荐阅读