R 按列重新排列表格

R 按列重新排列表格,r,dataframe,dplyr,R,Dataframe,Dplyr,我有这张桌子: nb_5 nb_10 nb_15 nb_20 nb_25 nb_30 nb_35 [1,] 0 0 1 0 0 0 0 [2,] 0 0 1 1 0 0 1 [3,] 0 0 1 0 2 0 1 [4,] 0 0 0 0 0 1 0 [5,]

我有这张桌子:

       nb_5 nb_10 nb_15 nb_20 nb_25 nb_30 nb_35
 [1,]    0     0     1     0     0     0     0
 [2,]    0     0     1     1     0     0     1
 [3,]    0     0     1     0     2     0     1
 [4,]    0     0     0     0     0     1     0
 [5,]    0     1     0     0     0     1     1
 [6,]    0     1     0     1     3     0     1
 [7,]    0     0     0     1     0     2     1
 [8,]    0     1     0     1     0     0     0
 [9,]    0     1     1     1     1     1     2
[10,]    0     1     0     1     1     0     0
此表中的数字表示我的值。每列表示我的值的条件。因此,在第一列中,我们有条件“nb_5”下的数据

可以将此表转换为2列:1列“nb_of”,重复5、10、15等

nb_of <- c(5,5,5,5,5,5,5,5,5,5,10,10,10,10,10,10,10,10,10,10,15,15,15,15)
data <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,0) 
newdata <- cbind(nb_of, data) 

nb\u of使用
dplyr
是一个选项,假设
m
是上面显示的矩阵:

#m%
变异(nb_of=as.integer(sub(“nb_”),nb_of))%>%
总目()
#数据的nb_
# 1     5    0
# 2     5    0
# 3     5    0
# 4     5    0
# 5     5    0
# 6     5    0
如果您从未在数据前加上
“nb\ucode>,您仍然需要使用
作为.integer
作为.numeric
,因为列名将作为
字符返回。这一点可以从以下几点看出:

colnames(m)%str()
#“数据帧”:70 obs。共有2个变量:
#$nb_of:chr“5”“5”“5”。。。
#$data:int 0 0 0 0 0 0。。。
这基本上就是将宽数据转换为长格式的问题。我们可以使用
数据。表
用于此目的:

库(data.table)
熔化(setDT(df1),
variable.name=“nb_of”,value.name=“data”,
measure.vars=colnames(df1))[,,
nb_of:=as.numeric(gsub('..''.\u','\\1',nb_of))][]
#>数据的nb_
#>  1:     5    0
#>  2:     5    0
#>  3:     5    0
#>  4:     5    0
#>  5:     5    0
#>  6:     5    0
#>  7:     5    0
#>  8:     5    0
#>  9:     5    0
#> 10:     5    0
##... 只是显示部分输出#
您可以忽略
measure.vars
,因为我们正在使用所有列,但您将得到以下警告:

数据:

阅读表格(text=“nb_5 nb_10 nb_15 nb_20 nb_25 nb_30 nb_35 [1,] 0 0 1 0 0 0 0 [2,] 0 0 1 1 0 0 1 [3,] 0 0 1 0 2 0 1 [4,] 0 0 0 0 0 1 0 [5,] 0 1 0 0 0 1 1 [6,] 0 1 0 1 3 0 1 [7,] 0 0 0 1 0 2 1 [8,] 0 1 0 1 0 0 0 [9,] 0 1 1 1 1 1 2 [10,]0110“->df1
搜索“从宽到长”,然后需要
sub
删除前导的
“nb_quot
(然后
as.integer
)。顺便说一句:您的第一个数据是一个
矩阵
,但您的解决方案是一个帧,因此您需要先将第一个数据转换为一个帧。这里有一个从宽到长的例子:,并给出了许多基本R和(如果向下滚动足够多的话)
tidyr
方法。如果您正在使用该软件包,还有
data.table::melt
。谢谢您的帮助。在我的函数中,我使用:
colnames(data)顺便说一句:即使以这种方式读取,它看起来也像一个矩阵,因为
print.data.frame
包含行名,它基于所提供的内容,是字符串
“[1,]”“
”[2,]”
,等等(回答您之前的评论:-)@r2evans是的,您是对的。但是我在底部指定了数据,而这不需要
作为.data.frame
,因为它是一个。然而,正如我在回复你的评论时指出的那样,我认为你有这一点是因为OP的实际数据集(他们没有提供可复制的数据集)。是的,我通常会像你在这里做的那样包含完整的数据,但这次略去了,谢谢你帮我收拾残局。。。我不确定我们是否应该产生一个实际的矩阵,因为我们从这个问题推断*耸耸肩*
#> Warning in melt.data.table(setDT(df1), variable.name = "nb_of", value.name
#> = "data"): To be consistent with reshape2's melt, id.vars and measure.vars
#> are internally guessed when both are 'NULL'. All non-numeric/integer/
#> logical type columns are considered id.vars, which in this case are columns
#> []. Consider providing at least one of 'id' or 'measure' vars in future.