2017-08-13 65 views
1

我有一个非常大的数据集,我想根据某些条件重新定位数据帧的某些值,请参阅下面我想要实现的示例,实例让说我有下面根据某些条件重新定位数据帧行

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应答(5),而V02应答(4)的对应值是V1应答(3)。 (5)的对应值为V1应答(2),对应V03应答(6)的对应值为V03应答(10),同时在第4行中,V01应答)是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 
+0

对不起,我的意思是,我想要实现的是基于V01到V05的相应值将V1重新定位到V5。 – Dare

+0

编辑您的问题 - 评论无法正确格式化代码。 – thelatemail

+0

你能解释为什么在第四行中'(V1,V2,V3)'是'(10,2,19)'而不是'(19,10,2)'?我想我不明白如何重新排列数据的逻辑。我最初以为你想改变基于价值的顺序(请参阅下面的答案),但似乎我错了。我暂时留下我的答案,以防我可以调整它,否则我会稍后再删除它。 – coffeinjunky

回答

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 
+0

以上例子,我意识到行的顺序已经改变,为示例行3现在在第2行输出,有没有办法让我仍然可以保持输出数据帧的行的顺序? – Dare

+0

请参阅我对你的问题的评论。如果你想要的输出是正确的,这不能回答你的问题。你能澄清我的问题吗? – coffeinjunky

+0

在任何情况下@Dare,我已经调整了代码以保留行排序。 – coffeinjunky