将 R 中 3 个变量的总和重新调整为恰好等于 1

问题描述 投票:0回答:1

我有一个如下的数据框,其中有 3 列,每列代表在单个活动中花费的时间比例。

df <- data.frame(ID = c(1, 2, 3, 4),
                (time_1 = c(0.2500, 0.2501, 0.2499, 0.2500),
                (time_2 = c(0.5000, 0.5000, 0.5001, 0.5001),
                (time_3 = c(0.2501, 0.2499, 0.5001, 0.2498),
                (sum_time = c(1.0001, 1.0000, 1.0001, 0.9999))

  ID    time_1   time_2   time_3   sum_time
  1     0.2500   0.5000   0.2501   1.0001
  2     0.2501   0.5000   0.2499   1.0000
  3     0.2499   0.5001   0.5001   1.0001
  4     0.2500   0.5001   0.2498   0.9999

我打算提取该数据的组成平均值,但是如果

sum_time
的所有值不完全等于 1,则无法提取。

我尝试使用

round(data$time_1, digits = 3)
四舍五入到更少的小数位,但是这会在不等于 1 的实例中返回
0.999
1.001
的值。

我还尝试创建一个函数,如果总和为

1.0001
0.9999
,则我将
0.0001
减去或添加到其中一个变量,因为以分钟为单位的时间差异微不足道。但是我无法让这些功能工作。

scale_compositions <- function(x){
  
if(df$sum_time== 1.0001) {df$time_1 - 0.0001}
if(df$sum_time == 0.9999) {df$time_1 + 0.0001}  
  
}

scale_compositions(x)

理想情况下,我能够重新调整那些等于

1.0001
0.9999
的变量,以便每个
time_
间隔增加或减少适当的量,以确保显示的比例尽可能准确,但已被到目前为止还无法弄清楚这一点。我一直在尝试各种 R 包中的
rescale
函数,目前无济于事。

考虑到

0.0001
对整个调查时间的重要性,删除或添加该值以确保每个比例等于 1 不太可能对结果产生有意义的影响(尽管这将被测试),我很乐意这样做暂时这样。

如有任何帮助,我们将不胜感激

r rescale
1个回答
0
投票

我希望我没有误解你的问题,但这可行吗?

df <- data.frame(
  ID = c(1, 2, 3, 4),
  time_1 = c(0.2500, 0.2501, 0.2499, 0.2500),
  time_2 = c(0.5000, 0.5000, 0.5001, 0.5001),
  time_3 = c(0.2501, 0.2499, 0.2500, 0.2498)
)

df$sum_time <- rowSums(df[, c("time_1", "time_2", "time_3")])
df$sum_time <- round(rowSums(df[, c("time_1", "time_2", "time_3")]), 3)
df
© www.soinside.com 2019 - 2024. All rights reserved.