我有调查数据,其中在6个不同的时期内向同一个人询问相同的问题。有时他们回答(在这种情况下,我们的分数是1到10),有时他们没有回答(在这种情况下,答案是0)。
最后,我得到了一个看起来像这样的数据帧(唯一的区别是,在此示例中,答案是从1到2,这仅仅是因为以这种方式生成足够数量的0更容易了) ):
period_1 <- sample(0:2, 100, replace=T)
period_2 <- sample(0:2, 100, replace=T)
period_3 <- sample(0:2, 100, replace=T)
period_4 <- sample(0:2, 100, replace=T)
period_5 <- sample(0:2, 100, replace=T)
period_6 <- sample(0:2, 100, replace=T)
df <- cbind(period_1, period_2, period_3, period_4, period_5, period_6)
head(df)
period_1 period_2 period_3 period_4 period_5 period_6
[1,] 0 2 1 1 0 1
[2,] 2 1 1 2 0 0
[3,] 1 0 2 0 1 1
[4,] 1 2 2 1 0 2
[5,] 1 1 2 2 0 2
[6,] 1 0 1 2 2 0
现在,我想看看他们的答案随着时间的变化。但是对于当前的数据帧结构,这有点尴尬:例如,我不能仅将时间段1与时间段2进行比较,因为它们并没有在时间段1(或2)全部回答。 取而代之的是,我想要的是一个数据帧,该数据帧将在一个向量中显示其第一个答案,无论该答案来自哪个时期,然后是第二个答案,依此类推……
换句话说,在Survey_1中获得第一个非0答案,在Survey_2中获得第二个非0答案,依此类推… 这可能不是最好的解决方案,但它是最简单的解决方案,对我来说也很好。
这将允许我打开它:
period_1 period_2 period_3 period_4 period_5 period_6
[1,] 0 2 1 1 0 1
[2,] 2 1 1 2 1 0
[3,] 1 0 2 0 1 1
对此:
survey_1 survey_2 survey_3 survey_4 survey_5 survey_6
[1,] 2 1 1 1 0 0
[2,] 2 1 1 2 1 0
[3,] 1 2 1 1 0 0
但是,老实说,我仍然是R和编程领域的新手,我什至不知道从哪里开始实现这一目标,而且我已经坚持了一段时间,没有做任何事情。寻求解决方案。
请问有人可以向我提供提示,甚至提供示例代码,让我获得所需的结果吗?
谢谢!
答案 0 :(得分:3)
我们可以根据行的元素是否为0来使用apply
和order
:
df[] <- t(apply(df, 1, function(x) x[order(x == 0)]))
结果:
period_1 period_2 period_3 period_4 period_5 period_6
[1,] 1 2 2 1 0 0
[2,] 2 2 1 0 0 0
[3,] 1 1 1 2 2 0
[4,] 2 2 1 2 1 0
[5,] 2 1 1 1 1 1
[6,] 2 2 1 1 0 0
数据:
df <- structure(c(0L, 2L, 1L, 2L, 2L, 0L, 1L, 0L, 1L, 2L, 1L, 2L, 0L,
2L, 1L, 1L, 1L, 2L, 2L, 0L, 2L, 2L, 1L, 1L, 2L, 0L, 2L, 1L, 1L,
1L, 1L, 1L, 0L, 0L, 1L, 0L), .Dim = c(6L, 6L), .Dimnames = list(
NULL, c("period_1", "period_2", "period_3", "period_4", "period_5",
"period_6")))