2017-10-05 81 views
1

在下面的示例數據框中,如果列v9包含'a',我正在尋找一種方法將值從第v2列開始向右移動,同時用零替換間隔。數據清理 - 在列之間移動數據

set.seed(0) 
df <- matrix(sample(c("a", 1:3), 100, replace = TRUE), nrow=10) 
colnames(df) <- c(paste0("v", 1:10)) 
df <- as_tibble(df) 
df$v11 <- 0 

# A tibble: 10 x 11 
     v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 
    <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <dbl> 
1  3  a  3  1  1  2  1  3  3  a  0 
2  1  a  3  1  3  1  3  1  1  a  0 
3  1  a  a  2  2  3  1  3  2  a  0 
4  2  2  2  1  3  1  1  1  1  2  0 
5  3  1  a  a  2  a  1  1  1  3  0 
6  a  3  1  3  2  a  2  1  3  3  0 
7  3  1  1  2  3  a  1  3  a  3  0 
8  3  2  a  3  a  1  1  3  2  1  0 
9  2  3  1  a  1  2  3  1  a  1  0 
10  2  1  3  2  2  2  a  3  a  3  0 

因此所得到的數據幀將是(行7,9,10移位):

v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 
1 3 a 3 1 1 2 1 3 3 a 0 
2 1 a 3 1 3 1 3 1 1 a 0 
3 1 a a 2 2 3 1 3 2 a 0 
4 2 2 2 1 3 1 1 1 1 2 0 
5 3 1 a a 2 a 1 1 1 3 0 
6 a 3 1 3 2 a 2 1 3 3 0 
7 3 0 1 1 2 3 a 1 3 a 3 
8 3 2 a 3 a 1 1 3 2 1 0 
9 2 0 3 1 a 1 2 3 1 a 1 
10 2 0 1 3 2 2 2 a 3 a 3 

回答

3

首先,得到其中v9列包含 'A' 的所有的行。

req_rows <- which(df$v9 == "a") 
req_rows 
[1] 7 9 10 

,移位細胞向右期望位置

df[req_rows,2:length(df)] <- df[req_rows,1:length(df)-1] 
> df 
# A tibble: 10 × 11 
     v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 
    <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 
1  3  a  3  1  1  2  1  3  3  a  0 
2  1  a  3  1  3  1  3  1  1  a  0 
3  1  a  a  2  2  3  1  3  2  a  0 
4  2  2  2  1  3  1  1  1  1  2  0 
5  3  1  a  a  2  a  1  1  1  3  0 
6  a  3  1  3  2  a  2  1  3  3  0 
7  3  3  1  1  2  3  a  1  3  a  3 
8  3  2  a  3  a  1  1  3  2  1  0 
9  2  2  3  1  a  1  2  3  1  a  1 
10  2  2  1  3  2  2  2  a  3  a  3 

第三,用零替換的間隙。

df$v2[req_rows] <- 0 

這導致

> df 
# A tibble: 10 × 11 
     v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 
    <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 
1  3  a  3  1  1  2  1  3  3  a  0 
2  1  a  3  1  3  1  3  1  1  a  0 
3  1  a  a  2  2  3  1  3  2  a  0 
4  2  2  2  1  3  1  1  1  1  2  0 
5  3  1  a  a  2  a  1  1  1  3  0 
6  a  3  1  3  2  a  2  1  3  3  0 
7  3  0  1  1  2  3  a  1  3  a  3 
8  3  2  a  3  a  1  1  3  2  1  0 
9  2  0  3  1  a  1  2  3  1  a  1 
10  2  0  1  3  2  2  2  a  3  a  3 
1
df[df$v9=='a',paste('v',2:11,sep = "")] <- 
            df%>% 
            select(v2:v11)%>% 
            filter(v9=='a')%>% 
             t()%>% 
            lag(default = 0)%>% 
             t()%>% 
             as_tibble()