簡體   English   中英

如何在R中循環遍歷數據幀的各列,並在新數據幀中以行的形式輸出每一列的分位數()

[英]How to loop through a dataframe's columns in R and output quantiles() for each column as a row in new dataframe

我正在嘗試計算數據框每一列的百分位數,以行形式存儲在新數據框中。 然后,我將繼續將此新df繪制為折線圖,該折線圖由數據中基於不同子組的不同折線包裝。

但是我當前的嘗試導致一個空的,未更新的df。

我可以在單個指定的列上執行以下操作:

dataframe:
    col1
1    15
2    24
3    23
4    25
5    25
sequence <- seq(from=0, to=1, by=0.01)
quantiles_df <- as.data.frame(quantile(df$col1, sequence))

並且我能夠執行以下操作來繪制多個直方圖,使用此代碼為數據框的每一列繪制1個

for (i in 1:length(df)){
print (i)
hist(df[[i]], main="histogram", breaks=20)
}

但是將此for循環與我的分位數函數合並會返回錯誤或僅返回1列數據幀。

返回一列的quantile.df

for (i in 1:length(df)){
print(i)
quantile.df <- as.data.frame(quantile(df[[i]], sequence, na.rm=TRUE))
}

嘗試使用名字而不是列號時返回錯誤

for (i in colnames(df)){
print(i)
quantile.df <- as.data.frame(quantile(genes2$[i], sequence, na.rm=TRUE))
}

預期成績:

120列乘101行的數據框,其中包含每個百分位數0到100的每個結果

實際結果:

使用length()時-> 1列x 101行數據幀

當使用colnames()->

Error: unexpected '[' in:
"print(i)
quantile.df <- as.data.frame(quantile(df$['



您的主要問題是您不會更改分配給的內容,每次通過循環嘗試覆蓋quantile.df ,都不會告訴R將內容放到新行中。

但是, sapply有一個更好的方法。 sapply將成為數據框各列的默認循環,應用一個函數並簡化結果。

這是一個簡單的示例,其中包含內置mtcars數據的一些分位數:

quants = c(0.25, 0.5, 0.75)
sapply(mtcars, quantile, probs = quants)
#        mpg cyl    disp    hp  drat      wt    qsec vs am gear carb
# 25% 15.425   4 120.825  96.5 3.080 2.58125 16.8925  0  0    3    2
# 50% 19.200   6 196.300 123.0 3.695 3.32500 17.7100  0  0    4    2
# 75% 22.800   8 326.000 180.0 3.920 3.61000 18.9000  1  1    4    4

(請注意,這是一個matrix ,您可能要在其上使用as.data.frame() 。)

同樣,您可以使用sapply(mtcars, hist)獲得每列的直方圖。

為了通過循環很好地做到這一點,您應該預先分配結果數據幀(所以它是正確的大小),然后逐列填充它。 如果您願意,我可以添加一個示例。

可復制的數據

df <- as.data.frame(matrix(rnorm(400), 100, 4))

直方圖和分位數

通過下面的代碼,您將同時獲得直方圖和分位數。 我使用mapply()而不是sapply()因為我想將直方圖的標題設計為每個列名。 如果沒有該請求,則可以對其進行修改。

par(mfrow = c(1, 4))
quant <- mapply(function(value, name){
  hist(value, main = paste0("Histogram of ", name), breaks = 20)
  quantile(value, seq(0, 1, by = 0.1))
}, df, names(df), SIMPLIFY = T)

quant

#               V1          V2          V3         V4
# 0%   -2.44712416 -2.63463290 -3.08872658 -2.8410463
# 10%  -0.88944226 -1.16264448 -1.24097984 -1.1701429
# 20%  -0.71782990 -0.91843217 -0.75868358 -0.8962623
# 30%  -0.51587838 -0.66932521 -0.52816811 -0.8046574
# ...

在此處輸入圖片說明

注意, mapply()的輸出是一個矩陣。 如果希望將其作為數據框,請嘗試:

as.data.frame(quant)

如果您希望分位數連續,請嘗試:

as.data.frame(t(quant))

暫無
暫無

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

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