[英]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.