2017-06-09 24 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的數據。的apply輸出是一個列表,所以我用do.call(rbind,listobject)縫合回在一起:

# 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)) 

讓我知道如果你有問題。

+0

這是否回答了您的問題? –

相關問題