【问题标题】:Order the data by nth column, get rowname of first row, do this for each column按第 n 列排序数据,获取第一行的行名,对每一列执行此操作
【发布时间】:2017-03-07 03:14:11
【问题描述】:

使用这个数据框

head(pcaFM_clim_var_cos2[,1:5])

                     Dim.1      Dim.2     Dim.3        Dim.4      Dim.5
dtr_mean_value_1 0.2583860 0.04524243 0.3004670 4.714854e-02 0.05262342
dtr_mean_value_2 0.2470183 0.04818929 0.3380621 4.220726e-02 0.05577386
dtr_mean_value_3 0.2459333 0.07231365 0.3690537 9.016624e-03 0.08165524
dtr_mean_value_4 0.2740264 0.09818961 0.3053862 2.670571e-03 0.08860495
dtr_mean_value_5 0.1910882 0.18521379 0.3373460 7.113687e-06 0.07396737
dtr_mean_value_6 0.2109406 0.18532406 0.3185838 6.542807e-03 0.10550687

我的目的是:

  1. 按 Dim.1 对数据进行排序
  2. 获取第一行的行名并将其附加到一个空向量中
  3. 对 Dim.2:Dim5 重复此操作,将第一个行名附加到同一向量。

我试过这个:

a <- character()
for (i in 1:5){
pcaFM_clim_var_cos2[order(-pcaFM_clim_var_cos2[,i])]
  clim_var <- append(a,head(pcaFM_clim_var_cos2[,0],1))
  }

但是向量 (clim_var) 是空的。

【问题讨论】:

  • 试试row.names(mtcars)[sapply(mtcars, which.min)]
  • which.min 给出具有最小值的索引,然后得到匹配的行名,无需排序。

标签: r loops append


【解决方案1】:

使用which.minsapply

# data
pcaFM_clim_var_cos2 <- read.table(text = "
Dim.1      Dim.2     Dim.3        Dim.4      Dim.5
dtr_mean_value_1 0.2583860 0.04524243 0.3004670 4.714854e-02 0.05262342
dtr_mean_value_2 0.2470183 0.04818929 0.3380621 4.220726e-02 0.05577386
dtr_mean_value_3 0.2459333 0.07231365 0.3690537 9.016624e-03 0.08165524
dtr_mean_value_4 0.2740264 0.09818961 0.3053862 2.670571e-03 0.08860495
dtr_mean_value_5 0.1910882 0.18521379 0.3373460 7.113687e-06 0.07396737
dtr_mean_value_6 0.2109406 0.18532406 0.3185838 6.542807e-03 0.10550687",
                                  header = TRUE)

# using which.min
clim_var <- 
  row.names(pcaFM_clim_var_cos2)[sapply(pcaFM_clim_var_cos2, which.min)]

clim_var
# [1] "dtr_mean_value_5" "dtr_mean_value_1" "dtr_mean_value_1" "dtr_mean_value_5" "dtr_mean_value_1"

【讨论】:

  • 我的真实数据框比这里发布的要大。我收到“无效下标”错误:
  • > row.names(pcaFM_clim_var_cos2)[sapply(pcaFM_clim_var_cos2, which.min)] row.names(pcaFM_clim_var_cos2)[sapply(pcaFM_clim_var_cos2, which.min)] 中的错误:无效的下标类型“列表”
  • 我发现了问题。我使用的是大矩阵而不是数据框。
【解决方案2】:

一个选项是max.col

row.names(pcaFM_clim_var_cos2)[max.col(-t(pcaFM_clim_var_cos2))]
#[1] "dtr_mean_value_5" "dtr_mean_value_1" "dtr_mean_value_1" 
#[4] "dtr_mean_value_5" "dtr_mean_value_1"

【讨论】:

  • 我用max.col(-t(mtcars), ties.method = "first")匹配which.min解决方案。
  • @zx8754 是的,它给出了相同的输出。
  • 如何修改此方法以不仅选择第一个行名,还选择前 5 个行名?
  • @jl-blancopastor 看起来您发布了一个新问题。所以,应该有人能够回答它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 2020-01-01
相关资源
最近更新 更多