根据某些条件重新定位数据框行

时间:2017-08-13 23:42:11

标签: r

我有一个非常大的数据集,我想根据某些条件重新定位数据帧的某些值,请参阅下面我想要实现的示例,例如,假设我有下面的数据框< / p>

V01 V02 V03 V04 V05 V1  V2  V3  V4  V5
12  NA  NA  NA  NA  2   NA  NA  NA  NA
23  4   NA  NA  NA  3   5   NA  NA  NA
16  NA  NA  NA  NA  7   NA  NA  NA  NA
25  5   6   NA  NA  2   19  10  NA  NA
21  14  NA  NA  NA  1   5   NA  NA  NA

对于每个V0,都有相应的V值,但问题是V1到V5的值是基于从V01到V05的值的升序。例如在第2行中,V01应答(23)的对应值是V2 Answer(5),而V02 Answer(4)的对应值是V1 Answer(3)。

同样在第4行中,V01 Answer(25)的对应值是V03 Answer(10),而V02 Answer(5)的对应值是V1 Answer(2)和相应的V03答案(6)是V1答案(19)。

对于只有一个值的行,肯定不会有任何问题。比如第1行和第3行

我想要实现的是根据V01到V05的相应值将V1重新定位到V5。请参阅下面示例的输出应该是什么样的

V01 V02 V03 V04 V05 V1  V2  V3  V4  V5
12  NA  NA  NA  NA  2   NA  NA  NA  NA
23  4   NA  NA  NA  5   3   NA  NA  NA
16  NA  NA  NA  NA  7   NA  NA  NA  NA
25  5   6   NA  NA  10  2   19  NA  NA
21  14  NA  NA  NA  5   1   NA  NA  NA

1 个答案:

答案 0 :(得分:2)

尝试以下方法:

library(reshape2)
library(dplyr)

df
  V01 V02 V03 V04 V05 V1 V2 V3 V4 V5
1  12  NA  NA  NA  NA  2 NA NA NA NA
2  23   4  NA  NA  NA  3  5 NA NA NA
3  16  NA  NA  NA  NA  7 NA NA NA NA
4  25   5   6  NA  NA  2 19 10 NA NA
5  21  14  NA  NA  NA  1  5 NA NA NA

df$rows <- 1:nrow(df) # to keep row order

以下内容可以写在一个长管道中,但为了便于阅读,我将其分为几行:

df <- melt(df, id.vars = c("rows", paste0("V0", 1:5)))
df <- df %>% group_by(V01) %>% arrange(desc(value))
df <- df %>% group_by(V01)  %>% mutate(ind = paste0("V", 1:n()))
df <- df %>% dcast(rows + V01 + V02 + V03 + V05 + V05 ~ ind, value.var = "value", fill = NA)
df$rows <- NULL

df
  V01 V02 V03 V05 V05 V1 V2 V3 V4 V5
1  12  NA  NA  NA  NA  2 NA NA NA NA
2  23   4  NA  NA  NA  5  3 NA NA NA
3  16  NA  NA  NA  NA  7 NA NA NA NA
4  25   5   6  NA  NA 19 10  2 NA NA
5  21  14  NA  NA  NA  5  1 NA NA NA