我是R的初学者。因此,这个问题可以被认为是一个基本问题。
当A,B或C = 0时,我试图将矩阵格式的数据转换为面板数据格式例如:
set.seed(0); mat <- matrix(sample(0:1, 16, replace=T), ncol=4, nrow=4)
colnames (mat) <- c("A", "B", "C", "D")
rownames (mat) <- c("1","2", "3", "4")
采用以下面板格式:
A 1
A 2
A 3
A 4
B 1
B 2
B 3
B 4
对于变量&#34; 1&#34; - &#34; 4&#34;是0.
我尝试使用plyr包中的apply代码。有人能为我提供正确的代码和论据,让R知道它应该提取A,B,C或D,如果&#34; 1&#34; = 0并重复相同的过程&#34; 2&#34;, &#34; 3&#34;和&#34; 4&#34;并且R将输出置于前者之下的新数据帧中?
我意识到上述问题不够明确。因此,我可以通过mtcars数据集更清楚地了解它。
cars <- mtcars
如果是这个数据集,我想要的格式是:
Mazda RX4 | mpg | 21.0
Mazda RX4 | cyl | 6
Mazda RX4 | disp | 160.0
...
Mazda RX4 Wag | mpg | 21.0
Mazda RX4 Wag | cyl | 6
...
等等。
答案 0 :(得分:0)
注释:您一直将行引用为变量。将变量连续排在最不容易的情况下,如果不直接危险,因为人们期望变量在列中!
如果您的变量被称为"1",...,"4"
,那么我认为A,...,D
是指您的观察结果?这会更令人困惑......
如果你对数据整洁的内容感兴趣,你应该阅读Hadley Wickhams的揭示article on tidy data。
关于您的问题:
使用mtcars
和tidyr
包中的dplyr
数据集和函数:
require(tidyr)
require(dplyr)
mtcars %>%
add_rownames() %>%
gather("id", "value", mpg:carb) %>%
arrange(rowname)
Source: local data frame [352 x 3]
rowname id value
(chr) (chr) (dbl)
1 AMC Javelin mpg 15.200
2 AMC Javelin cyl 8.000
3 AMC Javelin disp 304.000
4 AMC Javelin hp 150.000
5 AMC Javelin drat 3.150
6 AMC Javelin wt 3.435
7 AMC Javelin qsec 17.300
8 AMC Javelin vs 0.000
9 AMC Javelin am 0.000
10 AMC Javelin gear 3.000
.. ... ... ...
如果您不知道%>%
运算符(称为管道运算符),请将其读作“然后”。
答案 1 :(得分:0)
对于这段代码的mtcar
示例
library(data.table)
cars <- as.data.table(mtcars, keep.rownames = TRUE)
melt(cars, id.vars = "rn")[order(rn)]
将给出
rn variable value
1: AMC Javelin mpg 15.20
2: AMC Javelin cyl 8.00
3: AMC Javelin disp 304.00
4: AMC Javelin hp 150.00
5: AMC Javelin drat 3.15
---
348: Volvo 142E qsec 18.60
349: Volvo 142E vs 1.00
350: Volvo 142E am 1.00
351: Volvo 142E gear 4.00
352: Volvo 142E carb 2.00
请注意,mtcars
是data.frame
而不是matrix
。
Q中给出的矩阵mat
的解决方案是
melt(as.data.table(mat, keep.rownames = TRUE), id.vars = "rn")[value == 0][
order(variable, rn), .(variable, rn)]
将返回
rn variable value
1: A 2
2: A 3
3: B 2
4: C 3
5: C 4
6: D 1
7: D 3