我有一个如下的数据框,其中有 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 不太可能对结果产生有意义的影响(尽管这将被测试),我很乐意这样做暂时这样。
如有任何帮助,我们将不胜感激
我希望我没有误解你的问题,但这可行吗?
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