簡體   English   中英

R:for loop output 僅將最后結果保存在 output Z6A8064B5DF4779455507DZC553

[英]R: for loop output save only last results in output dataframe

我有以下 for 循環腳本:

# Create example data
dataKM <- data.frame(x1 = 1:5,    
                     x2 = 6:10,
                     x3 = 11:15)
# Duplicate dataframe
datatest <- dataKM[c(1:3)]

# for loop
for(i in colnames(dataKM[,2:ncol(dataKM)])) {
  # median of each single column of dataframe
  median <- median(dataKM[,i])
  # add column in duplicated dataframe with 'High' or 'low' based on median for each column
  datatest$median[dataKM[,i] <= median ] <- "Low"
  datatest$median[dataKM[,i] > median ] <- "High"
}

我正在嘗試對dataKM dataframe的每一列重復for循環,並將結果保存為數據集dataframe中的列。 我的腳本只保存最后一次迭代。 可能我得到一個 output 因為我在循環中的每次傳遞時覆蓋了以前的值。 我想知道如何將所有 for loop output 保存在各自的列中。 誰能幫我? 非常感謝,我希望這對嘗試做類似事情的其他人也有用。

我們可以使用lapply function

datatest <- dataKM[c(2:3)]
datatest[] <- lapply(dataKM[-1] , function(x) ifelse(x <= median(x) , "Low" , "High"))

colnames(datatest) <- c("x2Median" , "x3Median")

cbind(dataKM , datatest)

  • output
  x1 x2 x3  x2Median x3Median
1  1  6 11      Low      Low
2  2  7 12      Low      Low
3  3  8 13      Low      Low
4  4  9 14      High     High
5  5 10 15      High     High

如果你堅持使用for loop試試這個

datatest <- dataKM[c(1:3)]

for(i in colnames(dataKM[-1])) {
    median <- median(dataKM[,i])
    datatest[[paste0(i,"median")]][dataKM[,i] <= median ] <- "Low"
    datatest[[paste0(i,"median")]][dataKM[,i] > median ] <- "High"
}

我不確定什么與什么比較。 但這里有一個示例,將 x2 值或 x3 值與其列中位數進行比較:

這是 dplyr 方法:

library(dplyr)

dataKM %>% 
  mutate(across(-1, ~case_when(. <= median(., na.rm=TRUE) ~ "Low",
                               . > median(., nar.rm=TRUE) ~ "High"), .names = "Median_{.col}"))
  x1 x2 x3 Median_x2 Median_x3
1  1  6 11       Low       Low
2  2  7 12       Low       Low
3  3  8 13       Low       Low
4  4  9 14      High      High
5  5 10 15      High      High

目前,您正在更新一個新列median 只需調整以在for循環的每次迭代中創建新的中值列,將列當前列名稱和中值連接起來。

# for loop
for(col in colnames(dataKM[,2:ncol(dataKM)])) {
  curr_col <- dataKM[[col]]
  # median of each single column of dataframe
  col_median <- median(curr_col)

  # add column in duplicated dataframe with 'High' or 'low' based on median for each column
  datatest[[paste0(col, "_median")]][curr_col <= col_median] <- "Low"
  datatest[[paste0(col, "_median")]][curr_col > col_median] <- "High"
}

或者,使用ifelse

for(col in colnames(dataKM[,2:ncol(dataKM)])) {
  curr_col <- dataKM[[col]]
  col_median <- median(curr_col)

  datatest[[paste0(col, "_median")]] <- ifelse(
    curr_col <= col_median, "Low", " High"
  )
}

暫無
暫無

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

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