【问题标题】:Combining all data in a data frame per column and groups in R在R中将每列和组的数据框中的所有数据组合起来
【发布时间】:2019-08-11 15:28:56
【问题描述】:

我有这个数据集,它由 3 列和 5 个观察值组成:

sex <- c("M", "M", "F", "F", "F")
var1 <- c(1, 2, 3, 4, 5)
var2 <- c(6, 7, 8, 9, 10)

data <- data.frame(sex, var1, var2)
print(data)

   sex var1 var2
1   M   1   6
2   M   2   7
3   F   3   8
4   F   4   9
5   F   5   10

我想在每一列中将每个男性 (M) 除以每个女性 (F)。

在这个非常简单的示例中,我想为var1 获取1/31/41/52/32/42/5 的向量。

对于var2,向量将为6/86/96/107/87/97/10

最后,我将有 2 个向量,每个向量用于每个变量。

考虑到我有更多的列和行,我该如何自动化?

【问题讨论】:

  • 是否要扩展数据集。你能显示预期的输出吗
  • 它就像一个有两列的数据框(var1var2)。每一个都包含前面提到的每个向量中的索引。

标签: r loops for-loop


【解决方案1】:

一种选择是获取'sex'中为“M”的元素的索引,循环,对sex为“F”的'var'列进行子集化,并划分与“M”和@对应的变量987654321@

out <- do.call(rbind, lapply(which(data$sex == "M"), function(i) {
     d1 <- data[data$sex == "F", -1]
     data[i, -1][rep(1, nrow(d1)),]/d1 }))
row.names(out) <- NULL
out
#       var1      var2
#1 0.3333333 0.7500000
#2 0.2500000 0.6666667
#3 0.2000000 0.6000000
#4 0.6666667 0.8750000
#5 0.5000000 0.7777778
#6 0.4000000 0.7000000

另一个选项是outer

i1 <- which(data$sex == "M")
i2 <- setdiff(seq_len(nrow(data)), i1)
sapply(2:ncol(data), function(u) 
        outer(i1, i2, FUN  = function(i, j) data[i, u]/data[j, u]))
#      [,1]      [,2]
#[1,] 0.3333333 0.7500000
#[2,] 0.6666667 0.8750000
#[3,] 0.2500000 0.6666667
#[4,] 0.5000000 0.7777778
#[5,] 0.2000000 0.6000000
#[6,] 0.4000000 0.7000000

【讨论】:

  • 我收到此错误Error in dat[i, -1] : incorrect number of dimensions
  • @antecessor 我只使用了你的数据。无法重现错误
  • @antecessor 我把data 打错了dat。你现在可以检查吗
  • 不知道这有什么问题,因为我正在使用我的示例和您的代码。我现在收到此错误:Error in do.call(rbind, lapply(which(data$sex == "M"), function(i) { : 'what' must be a function or character string
  • @antecessor 我仔细检查过,它仍然没有任何错误地给出输出
【解决方案2】:

一种选择是在交叉连接模式下使用基本 R merge 函数:

cross <- merge(data[sex=="M",], data[sex=="F",], by=NULL)
df <- data.frame(var1=cross$var1.x/cross$var1.y, var2=cross$var2.x/cross$var2.y)
df

       var1      var2
1 0.3333333 0.7500000
2 0.6666667 0.8750000
3 0.2500000 0.6666667
4 0.5000000 0.7777778
5 0.2000000 0.6000000
6 0.4000000 0.7000000

我没有费心对上面的数据框进行排序,也没有引入任何原始变量,但这样做并不会太难。

【讨论】:

    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 2021-02-17
    相关资源
    最近更新 更多