簡體   English   中英

如何根據具有相同值但順序不同的另一行內容在數據框中創建新行?

[英]How to create new rows in a dataframe based on another row's contents with the same values but in different order?

我想以一種方式轉換我的數據集,對於每個原始行,其中的所有值都成為新行中的第一個,同時保留其他值。

我不確定這個解釋是否清楚,所以這里有一個例子:假設我有一個如下所示的數據框:

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

這意味着考慮到存在NA的事實(並且當存在一些時不創建新線)。

自2天以來,我一直在努力解決這個問題,因此任何幫助都將不勝感激!

非常感謝

我抓住了這個。 首先,我創建了一個以您希望的方式切換列的函數。 然后我通過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))

如果您有疑問,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM