对于我想要的东西,这可能有点困难,但我会尽我所能
这里说的是我在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的知识有限,这让我很麻烦
感谢您的时间
答案 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)
以下内容使用plyr库ldply
函数,该函数用于转换列表,其结果为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.frame
或list
...当然应该有意义: - )
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