簡體   English   中英

R-對每個變量進行排序,將id和value列存儲在輸出df中

[英]R - sort on each variable, store id and value columns in output df

我有一個大約80x300的數據框,這意味着它很大,需要高效地完成。 下面的例子。

id <- c("Alpha", "Bravo", "Charlie", Delta")
var1 <- c(1, 6, 4, 9)
var2 <- c(57, 49, 88, 14)
var3 <- c(11, 67, 2, 44)
df <- data.frame(id, var1, var2, var3)

我想以一個單獨的數據框結束,該數據框按每個變量對該數據進行排序,並存儲id列和value變量列。 它看起來像這樣:

var1.n     var1.v     var2.n     var2.v     ...
Delta      9          Charlie    88
Bravo      6          Alpha      57
Charlie    4          Bravo      49
Alpha      1          Delta      14
...

以前的嘗試不包括值變量(僅名稱變量),並且使用此方法完成

out <- as.data.frame(apply(df[,-1], 2, function(x) df$id[order(-x)]))

但是我還沒辦法弄清楚如何擴展它以包括id列和value變量。 我在下面嘗試了兩種方法,但是1)永遠無法使代碼正常運行,因為它使用了一些我不太熟悉的命令; 2)無法弄清楚如何實現我的頭腦。 首先是通過在每個位置注入一列NA來嘗試在原始數據幀中工作,但我很快發現這是行不通的。 第二個嘗試創建一個新的輸出框架,在其中按第i列進行排序,然后存儲id變量,然后存儲第i列,這看起來很有希望,但我必須丟失某些內容,因為它在運行時沒有做任何事情或給出了諸如替換錯誤之類的東西。

# attempt 1
for (i in 1:ncol(df)) {
  df<- as.data.frame(append(df, list(paste(colnames(df)[i],"name", sep="_")=NA), after=i))
  df<- order(df[i]) # would need to skip alternating rows
  df[i] <- df$id # not right at all
}

# attempt two
for (i in 1:ncol(df)) {
  order(df[i])
  out$paste(colnames(df)[i],"name", sep="_")] <- df$id
  out$paste(colnames(df)[i]) <- df[i]
}

這方面還有一些細微差別,因此,如果可能的話,我會喜歡一個通用的方法,但我會盡一切可能的幫助。

那這樣的東西呢?

sort_id <- function(d, column) {
  sorted <- d[order(d[ ,column], decreasing = TRUE), c(1, column)]
  names(sorted) <- paste0(names(sorted)[2], c(".n", ".v"))
  sorted
}


dfs <- Map(sort_id, replicate(3, df, simplify = FALSE), 2:4)
do.call(cbind, dfs)

   var1.n var1.v  var2.n var2.v  var3.n var3.v
4   Delta      9 Charlie     88   Bravo     67
2   Bravo      6   Alpha     57   Delta     44
3 Charlie      4   Bravo     49   Alpha     11
1   Alpha      1   Delta     14 Charlie      2

如果我沒記錯的話,您需要一個新的data.frame,其中包含排序后的變量,並且每個變量旁邊都有一個單獨的ID列。

我認為這就是您要尋找的(我根據您自己的示例編寫了它):

df2 <- data.frame(matrix(nrow = nrow(df), ncol = 0))
for(i in 2:ncol(df)) {
    newColName.n <- paste(colnames(df)[i], "n", sep = ".") # ID column for the current variable.
    newColName.v <- paste(colnames(df)[i], "v", sep = ".") # Sorted variable column in descending order.
    idx <- order(df[, i], decreasing = T)
    temp <- data.frame(v1 = df$id[idx], v2 = df[idx, i])
    colnames(temp) <- c(newColName.n, newColName.v)
    df2 <- cbind(df2, temp)
}

最后, df2是您想要的。

可以做到這一點會很費力。

df1 <-  lapply(names(df[,-1]), function(x) {
    o <-  cbind(df[1], df[x])
   colnames(o) <- c(paste0(x, ".n"), paste0(x, ".v") )
    o <- o[order(-o[2]),]
 })
 df2 <- do.call(cbind, df1)

暫無
暫無

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

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