2017-06-09 3 views
1

元の行ごとに、その中のすべての値が新しい行の最初の値になり、他の値は保持されるようにデータセットを変換したいと考えています。私はこの説明はので、ここで明確であるかわからない別の行の内容に基づいて同じ値であるが異なる順序でデータフレームに新しい行を作成するにはどうすればよいですか?

は一例です: のは、私はこのようになり、データフレームを持っているとしましょう:

V1   V2   V3  V4   V5   V6 
valve  valves  VALVE  VALVES  Valve  Valves 
vaporizer vaporizers Vaporizer Vaporizers NA  NA 
そして、私は

V1   V2   V3  V4   V5   V6 
valve  valves  VALVE  VALVES  Valve  Valves 
valves  valve  VALVE  VALVES  Valve  Valves 
VALVE  valves  valve  VALVES  Valve  Valves 
VALVES  valves  VALVE  valve  Valve  Valves 
Valve  valves  VALVE  VALVES  valve  Valves 
Valves  valves  VALVE  VALVES  Valve  valve 
vaporizer vaporizers Vaporizer Vaporizers NA   NA 
vaporizers vaporizer Vaporizer Vaporizers NA   NA 
Vaporizer vaporizers vaporizer Vaporizers NA   NA 
Vaporizers vaporizers Vaporizer vaporizer  NA   NA 

をしたいと思いますこれは、NAsが存在するという事実を考慮に入れることを意味する(ある場合には新しい行を作成しない)。

私はこの問題で2日間以上苦労しています。したがって、どんな助けでも大歓迎です!

ありがとうございました

答えて

0

私はこれを刺しました。最初に、あなたが望むようにカラムを切り替える機能を作った。次に、これをROWでデータに適用しました。

# data 
dat <- data.frame(V1 = c("valve","vaporizer"), V2 = c("valves","vaporizers"), 
        V3 = c("VALVE","Vaporizer"), V4 = c("VALVES","Vaporizers"), 
        V5 = c("Valve",NA), V6 = c("Valves",NA), 
        stringsAsFactors = F) 

# function 
musicalchairs <- function(x){ 
    y <- as.data.frame(matrix(NA, nrow = sum(!is.na(x)), ncol = length(x))) 
    y[1,] <- x 
    for(i in 1:length(x)){ 
    if(!is.na(x[i])){ 
     y[i+1,] <- c(y[1,i+1], y[i,-(i+1)]) 
    } 
    } 
    y[1:sum(!is.na(x)),] 
} 

# desired output 
do.call(rbind, apply(dat, 1, musicalchairs)) 

は、あなたが質問がある場合は、私に教えてください:applyの出力はので、私は一緒に戻ってそれをステッチするdo.call(rbind,listobject)を使用したリストです。

+0

これはあなたの質問に答えましたか? –

関連する問題