Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 有效地从大型数据集的数据帧创建矩阵_R_Dataframe_Bigdata_Reshape2_Melt - Fatal编程技术网

R 有效地从大型数据集的数据帧创建矩阵

R 有效地从大型数据集的数据帧创建矩阵,r,dataframe,bigdata,reshape2,melt,R,Dataframe,Bigdata,Reshape2,Melt,我试图从一个大数据帧创建一个矩阵。下面是一个示例数据帧 df <- data.frame(index=c("x","y","j","ww","rr","ff"), a=c(1,3,3,5,1,6), b=c(2,3,5,3,2,3), c=c(3,2,4,5,6,10), d =c("ha1","ha2","ha3","ha4","ha5","ha")) > df inde

我试图从一个大数据帧创建一个矩阵。下面是一个示例数据帧

df <- data.frame(index=c("x","y","j","ww","rr","ff"),
             a=c(1,3,3,5,1,6), 
             b=c(2,3,5,3,2,3),
             c=c(3,2,4,5,6,10),
             d =c("ha1","ha2","ha3","ha4","ha5","ha"))

> df
  index a b  c   d
1     x 1 2  3 ha1
2     y 3 3  2 ha2
3     j 3 5  4 ha3
4    ww 5 3  5 ha4
5    rr 1 2  6 ha5
6    ff 6 3 10  ha
因此,我使用的方法是首先使用melt将数据帧结构更改为类似这样的结构

df1 <- reshape2::melt(data = df, id.vars = c("index","d"), variable.name = "colname", value.name = "value")

> df1
   index   d colname value
1      x ha1       a     1
2      y ha2       a     3
3      j ha3       a     3
4     ww ha4       a     5
5     rr ha5       a     1
6     ff  ha       a     6
7      x ha1       b     2
8      y ha2       b     3
9      j ha3       b     5
10    ww ha4       b     3
11    rr ha5       b     2
12    ff  ha       b     3
13     x ha1       c     3
14     y ha2       c     2
15     j ha3       c     4
16    ww ha4       c     5
17    rr ha5       c     6
18    ff  ha       c    10
df1-df1
索引d colname值
1 x ha1 a 1
2 y ha2 a 3
3 j ha3 a 3
4 ww ha4 a 5
5 rr ha5 a 1
6 ff ha a 6
7 x ha1 b 2
8 y ha2 b 3
9J ha3 b5
10 ww ha4 b 3
11 rr ha5 b 2
12楼乙3
13 x ha1 c 3
14 y ha2 c 2
15 j ha3 c 4
16 ww ha4 c 5
17 rr ha5 c 6
18楼ha c 10
然后做acast

matrix <- acast(df1, index~colname, value.var="value")

matrix根据输出,我们可以删除第一列,即
字符
列,将数据集的其余部分转换为
矩阵
,并用第一列指定行名称

m1 <- `row.names<-`(as.matrix(df[-1]), df[,1])
str(m1)
# num [1:2, 1:3] 1 3 2 3 3 2
# - attr(*, "dimnames")=List of 2
#  ..$ : chr [1:2] "x" "y"
#  ..$ : chr [1:3] "a" "b" "c"
m1
#  a b c
#x 1 2 3
#y 3 3 2
更新 基于更新的数据集,我们可以在对数值列进行子集设置后应用相同的逻辑

`row.names<-`(as.matrix(df[2:4]), df[,1])

这不是要删除第一列,使用
as.matrix
转换为矩阵,并将行名更改为第一列吗?i、 e.
”row.names是否存在在预期输出中更改行顺序以跳入的逻辑。但这是一个非常简单的例子,我有更多的专栏。@JohnG当你展示一个简单的例子时,不清楚。你能用一个更复杂的例子来更新你的罐子吗issue@JohnG如果我是对的,它只需要对列进行子集。row.names得到了它。最主要的是我需要控制rowname和colname..例如使用acast acast(df1,index~colname,value.var=“value”),“index”将是我的rowname,“colname”将是我的columnname..@JohnG我理解你的观点,但我认为,如果最终目标是有一个包含一些选定列的矩阵,那么先进行
melt
,然后进行
cast
,效率会很低
library(tidyverse)
column_to_rownames(df, "x") %>%
      as.matrix
`row.names<-`(as.matrix(df[2:4]), df[,1])
m2 <- `row.names<-`(df[sapply(df, is.numeric)], df[,1])[order(df[,1]),]
m2
#   a b  c
#ff 6 3 10
#j  3 5  4
#rr 1 2  6
#ww 5 3  5
#x  1 2  3
#y  3 3  2