将R中的数据重新整形为奇异矩阵

时间:2015-02-24 21:18:18

标签: r

对于我想要的东西,这可能有点困难,但我会尽我所能

这里说的是我在R中的数据

R1  R2  R3  R4
a   b   a   a
b   d   c   b
            e

我想重塑数据框,以便它有一个单一矩阵形式的数据,比如

    a   b   c   d   e
R1  1   1   0   0   0
R2  0   1   0   1   0
R3  1   0   1   0   0
R4  1   1   0   0   1

我认为这很简单,因为它似乎很容易,但我对R的知识有限,这让我很麻烦

感谢您的时间

7 个答案:

答案 0 :(得分:4)

这个怎么样?

un <- sort(unique(c(as.matrix(df))))
res <- apply(df, 2, function(x) un %in% x)
rownames(res) <- un
res[] <-  as.numeric(res)
 t(res)
   a b c d e
R1 1 1 0 0 0
R2 0 1 0 1 0
R3 1 0 1 0 0
R4 1 1 0 0 1

答案 1 :(得分:1)

以下内容使用plyrldply函数,该函数用于转换列表,其结果为data.frame。

data_as_list = list(R1=c('a', 'b'), R2=c('b', 'd'), R3=c('a', 'c'), R4=c('a', 'b', 'e'))

result <- ldply(data_as_list, function(item) {
    sapply(letters[1:5], function(letter) letter %in% item)*1})

给定一个字符向量列表,我们通过询问向量中是否出现前5个字母(ae)来生成列表中每个data.frame的结果item的行({{1 }})。乘以1是将布尔向量转换为1或0整数向量的方法,如果这真的是你想要的那样。

结果:

item

修正行名称:

  .id a b c d e
1  R1 1 1 0 0 0
2  R2 0 1 0 1 0
3  R3 1 0 1 0 0
4  R4 1 1 0 0 1

现在你有:

rownames(result) <- result$.id
result <- result[, -which(colnames(result)=='.id')]

答案 2 :(得分:1)

Base R解决方案:

 data_as_list = list(R1=c('a', 'b'), R2=c('b', 'd'), R3=c('a', 'c'), R4=c('a', 'b', 'e'))

 stack(data_as_list)
#-----------
  values ind
1      a  R1
2      b  R1
3      b  R2
4      d  R2
5      a  R3
6      c  R3
7      a  R4
8      b  R4
9      e  R4
#---------
 xtabs( ~ values+ind, data=stack(data_as_list) )
#-----------
      ind
values R1 R2 R3 R4
     a  1  0  1  1
     b  1  1  0  1
     c  0  0  1  0
     d  0  1  0  0
     e  0  0  0  1

 xtabs( ~ ind+values, data=stack(data_as_list) )
#----------
    values
ind  a b c d e
  R1 1 1 0 0 0
  R2 0 1 0 1 0
  R3 1 0 1 0 0
  R4 1 1 0 0 1

答案 3 :(得分:1)

另一种方法是使用&#34; qdapTools&#34;中的mtabulate。包。这适用于data.framelist ...当然应该有意义: - )

library(qdapTools)
x <- mtabulate(df)
x[] <- as.numeric(x > 0)
x
#    V1 a b d c e
# R1  1 1 1 0 0 0
# R2  0 0 1 1 0 0
# R3  1 1 0 0 1 0
# R4  0 1 1 0 0 1

因为有两个&#34; d&#34; &#34; R2&#34;中的值,我们使用as.numeric(x > 0)转换为1和0。您可以删除已计算空白的第一列。

我使用了@barerd提供的示例数据:

df <- structure(list(R1 = structure(c(2L, 3L, 1L), .Label = c("", "a", 
"b"), class = "factor"), R2 = structure(c(2L, 2L, 1L), .Label = c("b", 
"d"), class = "factor"), R3 = structure(c(2L, 3L, 1L), .Label = c("", 
"a", "c"), class = "factor"), R4 = structure(1:3, .Label = c("a", 
"b", "e"), class = "factor")), .Names = c("R1", "R2", "R3", "R4"
), row.names = c(NA, -3L), class = "data.frame")

答案 4 :(得分:0)

这是一种可能性。这可以改进以更好地扩展。

matrix(as.numeric(rbind( ae %in% R1,
       ae %in% R2,
       ae %in% R3,
       ae %in% R4)),4,5)

答案 5 :(得分:0)

首先,我想这是来自csv文件或表的数据,您可以使用read.table()或read.csv()将其读入R..

你应该把它与dput()放在一起,如:

structure(list(R1 = structure(c(2L, 3L, 1L), .Label = c("", "a", 
"b"), class = "factor"), R2 = structure(c(2L, 2L, 1L), .Label = c("b", 
"d"), class = "factor"), R3 = structure(c(2L, 3L, 1L), .Label = c("", 
"a", "c"), class = "factor"), R4 = structure(1:3, .Label = c("a", 
"b", "e"), class = "factor")), .Names = c("R1", "R2", "R3", "R4"
), row.names = c(NA, -3L), class = "data.frame")

这样我们就可以轻松地将它放入R中。

您可以使用“重塑”库对数据进行搜索。有many documents用于重新整形R中的数据,包括帮助页面,但基本上你可以转置()你的数据,以便列成为行。你可以融化()它,使每一行成为一个唯一的id变量组合,如:

   X1 X2 value
1  R1  1     a
2  R2  1     d
3  R3  1     a
4  R4  1     a
5  R1  2     b
6  R2  2     d
7  R3  2     c
8  R4  2     b
9  R1  3      
10 R2  3     b
11 R3  3      
12 R4  3     e

然后,您可以将熔化的数据(数据,公式,函数)转换为任何形状。由于您希望根据R * stuff看到值的分布,我使用了以下公式:

t(cast(melt(t(t), id=c("a", "b", "c", "d", "e")), value~X1, ))[, c(2:6]

得到了:

   a b c d e
R1 1 1 0 0 0
R2 0 1 0 2 0
R3 1 0 1 0 0
R4 1 1 0 0 1

答案 6 :(得分:0)

x1<-as.character(grep("[a-z]",unique(unlist(df)),value=TRUE)) #df is data
x2<-data.frame(do.call(rbind,lapply(1:ncol(df),function(i){ifelse(x1 %in% df[,i],1,0)})))
colnames(x2)<-x1
row.names(x2)<-names(df)

 x2
   a b d c e
R1 1 1 0 0 0
R2 0 1 1 0 0
R3 1 0 0 1 0
R4 1 1 0 0 1