我有一种情况需要使用R中的 reshape2 包来融化数据。
melt(head(faithful), measure.vars = names(faithful))
这给出了输出:
variable value
1 eruptions 3.600
2 eruptions 1.800
...
7 waiting 79.000
8 waiting 54.000
...
我想根据dataframe中的列命令输出包含前几行。例如:
variable value
1 eruptions 3.600
2 waiting 79.000
3 eruptions 1.800
4 waiting 54.000
...
如何通过避免循环实现这一目标。
答案 0 :(得分:3)
我会使用额外的列tag
df<-faithful
df<-cbind(df,tag=1:nrow(faithful))
df2<-melt(df,id.vars = "tag")
df2<-df2[order(df2$tag),]
df2$tag<-NULL#drop it like it's hot
head(df2)
Ergo:
variable value
1 eruptions 3.600
273 waiting 79.000
2 eruptions 1.800
274 waiting 54.000
3 eruptions 3.333
275 waiting 74.000
答案 1 :(得分:2)
我知道要求reshape2
解决方案,但另一个好方法是使用tidyverse
。
library(tidyverse)
head(faithful) %>% mutate(tag = 1:n()) %>% gather(var, val, -tag) %>% arrange(tag)
tag var val
1 1 eruptions 3.600
2 1 waiting 79.000
3 2 eruptions 1.800
4 2 waiting 54.000
# etc
不需要中间对象。