【问题标题】:How can I rescale dataframe so each row have magnitude of 1 in R?如何重新缩放数据框,使每行在 R 中的大小为 1?
【发布时间】:2020-04-12 21:23:55
【问题描述】:

这是我的矩阵和代码的示例。我想重新调整我的数据框,使每一行的大小为 1。 我是 r 的新手,在教程中,讲师说“将行的每个元素除以行的大小”。但是我不确定如何获得行的大小或重新调整数据帧。所以我尝试使用 apply() 但是在使用 sqrt(sum(sc_mydata[r,]^2)) 测试我的重新缩放后,我没有得到 1 并且我x 的结果应该是 1

#dataframe
myData <- myData[1:12]

#transpose
x <- t(myData)

#rescale the data
sc_mydata = apply(x[-1,], 1, scale)

#test rescale 
for (r in 1:nrow(sc_mydata)) {
  #test rescale if this  is equal to 1 then the rescaling worked 
  x <- sqrt(sum(sc_mydata[r,]^2))

  }


     atr1     atr2     atr3     atr4     atr5     atr6     atr7     atr8     atr9    atr10    atr11    atr12
1 -0.35975 -0.42125 -0.33200 -0.08900 -0.16175 -0.44275 -0.38925  0.02975 -0.68525 -0.27500
2  0.01950 -0.27875 -0.18450 -0.30775 -0.34625  0.00200 -0.12425 -0.29475 -0.35375 -0.09575 -0.39150  0.00225
3  0.08350 -0.23125 -0.28025 -0.28975 -0.37325  0.01525 -0.11725 -0.29775 -0.32325 -0.09500 -0.55850 -0.11700
4  0.02225 -0.23675 -0.22425 -0.33925 -0.37075 -0.00375 -0.18450 -0.29250 -0.38450 -0.00400 -0.38975 -0.13850
5  0.05125 -0.35400 -0.31425 -0.35700 -0.26650 -0.07725 -0.11275 -0.34125 -0.30575  0.00550 -0.57025 -0.20600
6  0.01650 -0.28350 -0.10775 -0.29775 -0.16250 -0.03675 -0.1360

【问题讨论】:

  • 请添加一些可重现的代码,我们不知道myData 的样子。

标签: r vector scale rescale


【解决方案1】:

我们可以使用rowSums 以矢量化方式做到这一点

x/rowSums(x)

【讨论】:

    【解决方案2】:

    如果您的讲师通过“行的大小”表示“行的总和”,则此方法有效:

    
    sc_mydata <- apply(x, 1, function(x) x / sum(x, na.rm = TRUE))
    sc_mydata <- t(sc_mydata)
    
    
    

    由于某种原因,逐行的apply() 函数转置了数据框,所以我不得不将其转置回来。我不使用 apply 太多(更喜欢 tidyverse 工具而不是 base R)所以我知道为什么会发生这种情况。

    【讨论】:

    • 样本数据建议NA 值,您可能需要sum(x, na.rm=TRUE)
    • @AdamB。谢谢你的帮助我认为它正在工作我可以问我如何确认我尝试应用的重新缩放工作 sqrt(sum(sc_mydata[r,]^2)) 但它没有给我每行 1 个跨度>
    猜你喜欢
    • 2013-10-28
    • 1970-01-01
    • 2021-08-27
    • 2015-05-01
    • 2022-11-28
    • 2012-11-26
    • 2011-08-04
    • 2018-07-19
    • 1970-01-01
    相关资源
    最近更新 更多