2017-10-05 8 views
1

以下のデータフレーム例では、列v2に「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' を含むすべての行を取得します。ゼロでギャップを置き換え、

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 

第三の所望の位置に右へ細胞を移動させる第

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

、。

> 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() 
もたらす

df$v2[req_rows] <- 0 

関連する問題