r - 分割一列,获取分割列的平均值,并更新结果

标签 r data.table strsplit

我目前正在尝试将包含一系列值(作为字符)的列分成两个数字列,以计算它们的平均值(如果一行有一个范围)。然后,我想用更新后的结果替换旧列。实际上,有多个列需要完成..我试图找到一种方法,但这对我来说似乎具有挑战性。

下面是我尝试过的代码..它不起作用..

test.val <- data.table(id = c(1, 2, 3), 
                       colA = c("100-150", "200", "300"), 
                       colB = c("15", "20-30", "10"))
test.A <- test.val[, lapply(.SD, function(x){strsplit(x, split = "-")}), .SDcols = c("colA", "colB")]
test.B[, lapply(.SD, mean), .SDcols = c("colA", "colB")]

最后,我希望得到以下内容:

   id colA colB
1:  1  125   15
2:  2  200   25
3:  3  300   10

有谁可以帮帮我吗? 非常感谢。

最佳答案

使用data.table的另一个选项

library(data.table)
cols <- c("colA", "colB")
for(j in cols) {
  tmp <- vapply(strsplit(test.val[[j]], "-"), 
                FUN = function(i) mean(as.numeric(i)), 
                FUN.VALUE = numeric(1))
  set(test.val, j = j, value = tmp)
}
test.val
#   id colA colB
#1:  1  125   15
#2:  2  200   25
#3:  3  300   10

给定一个向量

x <- c("100-150", "200", "300")

strsplit 的结果是字符向量列表

strsplit(x, "-")
#[[1]]
#[1] "100" "150"

#[[2]]
#[1] "200"

#[[3]]
#[1] "300"

我们将其包装到 vapply 中,并在将每个向量转换为数字后计算每个元素的平均值。

vapply(strsplit(x, "-"), function(x) mean(as.numeric(x)), numeric(1))
# [1] 125 200 300

我们使用此结果来使用 data.tableset 函数替换 cols 中指定的每一列。

关于r - 分割一列,获取分割列的平均值,并更新结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54373355/

相关文章:

r Shiny 的条件显示

python - 如何在机器学习数据预处理中处理日期变量

r - 在data.frame中按行拆分并按列分配结果

r - 拆分字符串、标记子字符串并将标记转换为数字向量

r - 在 Shiny 的应用程序上,ggplotly() 渲染的大小是 plot_ly() 的一半。如何解决?

r - 如何在 RStudio 中绘图而不弹出新窗口(R Graphics : Device (ACTIVE)?

R 数据表优化。 overdraw 财务数据

r - data.table 中的条件连接?

r - R中Data.Table的优化?

r - 如何删除R中数据帧列中的部分字符串?