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.