【问题标题】:Loop with column binding带有列绑定的循环
【发布时间】:2023-03-16 14:17:02
【问题描述】:

我是自学成才的用户,所以请多多包涵。

我有类似以下数据集:

individual  value
a   0.917741317
a   0.689673689
a   0.846208486
b   0.439198006
b   0.366260159
b   0.689985484
c   0.703381117
c   0.29467743
c   0.252435687
d   0.298108973
d   0.42951805
d   0.011187204
e   0.078516181
e   0.498118235
e   0.003877632

我想创建一个矩阵,其中 a 的值在 column1 中,b 的值在 column2 中,等等。[我还在每列的底部添加一个 1 以用于以后的代数运算]

到目前为止我已经尝试过:

  for (i in unique(df$individual)) {
    values <- subset(df$value, df$individual == i)
    m <- cbind(c(values[1:3],1))

  }

我得到一个 (4,1) 矩阵,其中包含最后一个单独的值。缺少什么来使其对每个循环进行累加并获得与个人一样多的列?

【问题讨论】:

  • reshape2 是一个更好的解决方案,但这是一个愚蠢的方式matrix(DF$value, nrow = 3)
  • 这对我来说并不愚蠢。分配给 res.mtx 并使用rbind( res.mtx, rep(1, ncol(res.mtx) ) )

标签: r loops matrix cbind


【解决方案1】:

此操作称为“重塑”。有一个基本功能,但我发现使用 reshape2 包更容易:

DF <- read.table(text="individual  value
a   0.917741317
a   0.689673689
a   0.846208486
b   0.439198006
b   0.366260159
b   0.689985484
c   0.703381117
c   0.29467743
c   0.252435687
d   0.298108973
d   0.42951805
d   0.011187204
e   0.078516181
e   0.498118235
e   0.003877632", header=TRUE)

DF$id <- 1:3

library(reshape2)
DF2 <- dcast(DF, id ~ individual)
DF2[,-1]
#          a         b         c         d           e
#1 0.9177413 0.4391980 0.7033811 0.2981090 0.078516181
#2 0.6896737 0.3662602 0.2946774 0.4295180 0.498118235
#3 0.8462085 0.6899855 0.2524357 0.0111872 0.003877632

【讨论】:

  • 我的意思是,R 中似乎有很多粗鲁/怪癖/20 岁的陷阱。reshape2 使 R 中的编程更简洁/更容易;你知道其他有用的小清洁包吗?
  • 这很大程度上取决于你想做什么。我不知道 R 中有很多“粗鲁/怪癖/20 岁的陷阱”。
  • 嗯,The R inferno 是“一本关于 R 中的麻烦点、怪事、陷阱和故障的书。”还是谢谢。
猜你喜欢
  • 2012-05-26
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多