【问题标题】:Looking for a way to create a "median split" variable for several variables寻找一种为多个变量创建“中位数分割”变量的方法
【发布时间】:2022-01-18 21:06:53
【问题描述】:

我有一个包含大约 40 个不同变量的数据集。现在我想创建一个新变量来指示每个观察值是高于还是低于中位数。

我设法从现有的“var1”创建了一个新变量“var1_mediansplit”(值 1 表示低于中位数,2 表示其他所有值):

mydata$var1_mediansplit <- ifelse(mydata$var1 < median(mydata$var1), mydata$var1_mediansplit <- "1", mydata$var1_mediansplit <- "2"

我正在寻找一种通过几个变量运行它的方法(我猜是循环)。感谢您的帮助!

编辑:jblood94 的解决方案对我有用,所以谢谢!

【问题讨论】:

标签: r


【解决方案1】:

使用Rfast 包中的colMedianseachrow

library(Rfast)

df <- as.data.frame(matrix(runif(4000), ncol = 40)) # dummy data
m <- as.matrix(df)
df2 <- as.data.frame((eachrow(m, colMedians(m), "-") >= 0) + 1)

详细解释:

  1. colMedians(m) 返回每​​列的中位数(一个向量 长度 40)。
  2. eachrow 为第一个参数获取一个矩阵,为第二个参数获取一个向量(长度与矩阵中的列数相同),为第三个参数获取一个运算符。矩阵的每一行都有根据运算符应用到它的向量。所以这里从m的每一行中减去colMedians(m)向量。
  3. eachrow 的结果与0 进行比较(FALSE 如果小于0,则TRUE 否则)。
  4. 对带有数字的逻辑进行操作会将其强制转换为数字:FALSE + 1 = 1TRUE + 1 = 2

【讨论】:

  • 我在项目休息后又回到了这个问题上,现在我无法理解 eachrow 函数。你能解释一下 eachrow 在这里做什么吗?我不明白运算符“-”和 >= 0) + 1。谢谢!
  • 查看我刚才添加的详细说明。
【解决方案2】:

不要过于复杂,考虑一下:

v <- c(1:100)
x <- median(v)
y <- v >= x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    相关资源
    最近更新 更多