如何逐行融化数据帧?我在论坛上发现了一个非常相似的问题,但是如果没有其他id变量,我仍然无法解决我的问题。
这是我的数据集:
V1 V2 V3 V4 V5
51 20 29 12 20
51 22 51 NA NA
51 14 NA NA NA
51 75 NA NA NA
Run Code Online (Sandbox Code Playgroud)
我想将其融合为:
V1 variable value
51 V2 20
51 V3 29
51 V4 12
51 V5 20
51 V2 22
51 V3 51
51 V2 14
51 V2 75
Run Code Online (Sandbox Code Playgroud)
目前,我的方法是使用for循环逐行将其融化,然后将它们重新绑定在一起。
library(reshape)
df <- read.table(text = "V1 V2 V3 V4 V5 51 20 29 12 20 51 22 51 NA NA 51
+14 NA NA NA 51 75 NA NA NA", header = TRUE)
dfall<-NULL
for (i in 1:NROW(df))
{
dfmelt<-melt(df,id="V1",na.rm=TRUE)
dfall<-rbind(dfall,dfmelt)
}
Run Code Online (Sandbox Code Playgroud)
只是想知道是否有任何方法可以更快地做到这一点?谢谢!
我们复制第一列“V1”和names数据集(第一列名称除外)的 ,以创建预期输出的第一列和第二列,而“值”列是通过转置没有第一列的数据集来创建的。
na.omit(data.frame(V1=df1[1][col(df1[-1])],
variable = names(df1)[-1][row(df1[-1])],
value = c(t(df1[-1]))))
# V1 variable value
#1 51 V2 20
#2 51 V3 29
#3 51 V4 12
#4 51 V5 20
#5 51 V2 22
#6 51 V3 51
#9 51 V2 14
#13 51 V2 75
Run Code Online (Sandbox Code Playgroud)
注意:没有使用额外的包。
或者,在创建行 id 列 ( from ) 和行后,我们可以使用gather(from ) 将“宽”格式转换为“长”格式。tidyradd_rownamesdplyrarrange
library(dplyr)
library(tidyr)
add_rownames(df1) %>%
gather(variable, value, V2:V5, na.rm=TRUE) %>%
arrange(rowname, V1) %>%
select(-rowname)
# V1 variable value
# (int) (chr) (int)
#1 51 V2 20
#2 51 V3 29
#3 51 V4 12
#4 51 V5 20
#5 51 V2 22
#6 51 V3 51
#7 51 V2 14
#8 51 V2 75
Run Code Online (Sandbox Code Playgroud)
或者与data.table
library(data.table)
melt(setDT(df1, keep.rownames=TRUE),
id.var= c("rn", "V1"), na.rm=TRUE)[
order(rn, V1)][, rn:= NULL][]
Run Code Online (Sandbox Code Playgroud)