R如何将不同的数据框列合并为一

标签 r reshape

我在 R 中有一个数据框,看起来像这样

data
x1  x2  x3a x3b x3c x3d x4
A   43  0   0   0   1   P
B   23  0   1   0   0   Q
C   11  0   0   0   0   R 
D   66  0   0   1   0   S

现在我想合并列 x3a, x3b, x3c, x3d到单列。预期的单列将包含 x3a,x3b,x3c,x3d 中值为 1 的列号.该值应编号为 (x3a=1,x3b=2,x3c=3,x3d=4) .预期结果如下
x3
[1] 4    2    0    3

我试过 reshape()功能,但无法得到我真正想要的
q<-data[,3:6]
r<-reshape(q,varying=c("x3a","x3b","x3c","x3d"),v.names="x3",direction="long",times=c("x3a","x3b","x3c","x3d"))
final<-r[r$x3!=0,][,3]

但这并没有给出预期的结果。它错过了值(value) 0之间23 :
final
[1]4    2    3 

最佳答案

这有效:

data <- data.frame(
  x1 = c('A','B','C','D'),
  x2 = c(43,23,11,66),
  x3a = c(0,0,0,0),
  x3b = c(0,1,0,0),
  x3c = c(0,0,0,1),
  x3d = c(1,0,0,0),
  x4 = c('P','Q','R','S')
)
data$x3 <- as.matrix(data[,c('x3a','x3b','x3c','x3d')]) %*% c(1,2,3,4)

结果:

  x1 x2 x3a x3b x3c x3d x4 x3
1  A 43   0   0   0   1  P  4
2  B 23   0   1   0   0  Q  2
3  C 11   0   0   0   0  R  0
4  D 66   0   0   1   0  S  3

蔡斯发表了相关评论:如果 x3a ... x3d 会怎样?不同于零或一?您可以使用 ifelse()考虑这种情况:
data$x3 <- as.matrix(ifelse(data[,c('x3a','x3b','x3c','x3d')] > 0, 1, 0)) %*% c(1,2,3,4)

关于R如何将不同的数据框列合并为一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25983438/

相关文章:

r - dplyr 错误 - 当第一组全部为 NA 时,分组的 ntile 失败

r - 从 Rle 向量高效构建 GRanges/IRanges

python - 如何 reshape 这个数据框

python - 在 Python (Pandas) 中将长数据 reshape 为宽数据

python - 将 torch 张量从 [10,200,1] reshape 为 [2000,1,1] 时出现问题

r - ggplot2 绘图 : Change Text in Case it Exceeds the Plot Window when Exporting as PNG

r - 嵌套的 if else 语句将标签附加到值

r - 如何在 r 中排序后保留矩阵类

machine-learning - tensorflow 形状不正确

python-3.x - Python 3.6 numpy reshape 可以工作,但值包含 e