将两个变量列合并为一个的方法

29

我有一个数据框中包含以下变量:

[1] "Type"   "I.alt"  "idx06"  "idx07"  "idx08" "farve1" "farve2"
如果我这样做:
dm <- melt(d, id=c("Type","I.alt"))

我获取到了这些变量:

"Type"     "I.alt"    "variable" "value"   

"idx06", "idx07", "idx08", "farve1", and "farve2" are represented by the variable."

However, I actually want something like this:

"Type"     "I.alt"    "variable" "value" "variable2" "value2"

其中“farve1”和“farve2”在variable2和value2中表示。

我之所以想做这个,是因为我希望当值下降时线条颜色为绿色,上升时为红色。 编辑:Shane已经展示了如何通过两个融合的融化来重塑数据。但是,我的策略从一开始就似乎是不合理的 - 用一个词来说是错误的。请参见我对Shane解决方案的评论。

ggplot(dm, aes(x=variable,y=value,group=Type,col=variable2, label=Type,size=I.alt))+
geom_line()+
geom_text(data=subset(dm, variable=="idx08"),hjust=-0.2, size=2.5)+
theme_bw()+
scale_x_discrete(expand=c(0,1))+
opts(legend.position="none")

我猜我需要转换熔融框架 - 但我想不出来。

d <- structure(list(Type = structure(c(8L, 21L, 23L, 20L, 6L, 14L, 
3L, 24L, 2L, 28L, 32L, 22L, 15L, 29L, 1L, 17L, 18L, 33L, 25L, 
13L, 30L, 11L, 26L, 9L, 12L, 4L, 5L, 27L, 16L, 19L, 10L, 31L, 
7L), .Label = c("Alvorligere vold", "Andre strafferetlige særlove", 
"Andre tyverier", "Bedrageri", "Brandstiftelse", "Butikstyverier m.v.", 
"Dokumentfalsk", "Færdselslovovertræd. i øvrigt", "Færdselsuheld med spiritus", 
"Falsk forklaring i øvrigt", "Forbr. mod off. myndighed m.v.", 
"Freds- og ærekrænkelser", "Hæleri", "Hærværk", "Indbrud i bank, forretn. m.v.", 
"Indbrud i fritidshuse, garager mv", "Indbrud i villaer, lejligheder mv", 
"Love vedr. forsvaret og lign.", "Love vedr. spil, bev., næring", 
"Lov om euforiserende stoffer", "Mangler ved køretøj", "Røveri", 
"Simpel vold", "Spiritus- og promillekørsel", "Trusler", "Tyv./brugstyv. af andet", 
"Tyv./brugstyv. af cykel", "Tyv./brugstyv. af indr. køretøj", 
"Tyv/brugstyv. af knallert", "Tyveri fra bil, båd m.v.", "Ulovlig omgang med hittegods", 
"Våbenloven", "Vold o.l. mod off. myndighed"), class = "factor"), 
I.alt = c(16137L, 9519L, 5930L, 5502L, 4887L, 3582L, 3101L, 
1738L, 1660L, 1649L, 1551L, 1412L, 1338L, 1164L, 1154L, 1057L, 
931L, 907L, 857L, 724L, 681L, 644L, 641L, 505L, 450L, 419L, 
405L, 328L, 324L, 324L, 320L, 281L, 262L), idx06 = c(1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), idx07 = c(0.972675591417568, 
0.766866371450899, 0.931743805516597, 0.813047711781889, 
0.88728323699422, 0.96420233463035, 0.855743544078362, 1.03710247349823, 
0.751470588235294, 0.90443686006826, 0.808403361344538, 0.902834008097166, 
0.718181818181818, 0.904555314533623, 1.02717391304348, 0.68957345971564, 
1.10324483775811, 0.93030303030303, 0.805309734513274, 0.843003412969283, 
0.74914089347079, 0.824786324786325, 1.04060913705584, 1.09150326797386, 
0.977941176470588, 0.892405063291139, 0.966666666666667, 
0.828125, 0.696, 0.813559322033898, 0.697841726618705, 0.88235294117647, 
0.62280701754386), idx08 = c(0.986612873647533, 0.712685595207085, 
0.840579710144927, 0.865628042843233, 0.93757225433526, 0.823346303501945, 
0.905609973285841, 1.03356890459364, 0.689705882352941, 0.909556313993174, 
0.798319327731092, 0.955465587044534, 0.714545454545455, 
0.620390455531453, 1.10869565217391, 0.815165876777251, 0.64306784660767, 
0.818181818181818, 0.722713864306785, 0.627986348122867, 
0.59106529209622, 0.927350427350427, 1.21319796954315, 1.20915032679739, 
1.33088235294118, 0.759493670886076, 1.40833333333333, 0.734375, 
0.896, 0.932203389830508, 0.60431654676259, 0.872549019607843, 
0.675438596491228), farve1 = c("green", "green", "green", 
"green", "green", "green", "green", "red", "green", "green", 
"green", "green", "green", "green", "red", "green", "red", 
"green", "green", "green", "green", "green", "red", "red", 
"green", "green", "green", "green", "green", "green", "green", 
"green", "green"), farve2 = c("red", "green", "green", "red", 
"red", "green", "red", "green", "green", "red", "green", 
"red", "green", "green", "red", "red", "green", "green", 
"green", "green", "green", "red", "red", "red", "red", "green", 
"red", "green", "red", "red", "green", "green", "red")), .Names = c("Type", 
"I.alt", "idx06", "idx07", "idx08", "farve1", "farve2"), class = "data.frame", row.names = c(NA, -33L))
2个回答

33

这不回答您关于类型转换的问题,但您可以通过对数据进行子集操作并执行两次“melt”操作,然后再合并:

dm1 <- melt(d[,c("Type","I.alt","idx06","idx07","idx08")], id=c("Type","I.alt"))
dm2 <- melt(d[,c("Type","I.alt","farve1","farve2")], id=c("Type","I.alt"))
colnames(dm2) <- c("Type", "I.alt", "variable2", "value2")
dm <- merge(dm1, dm2)

或者等价地,先进行一次melt操作(例如您当前正在执行的操作),然后将融合的数据框两次子集化(其中一个子集是idx <- variable %in% c("idx06","idx07","idx08"), 另一个是!idx),并将两个子集合并。

以任一种方式都可以得到您想要的结果:

> head(dm)
              Type I.alt variable    value variable2 value2
1 Alvorligere vold  1154    idx08 1.108696    farve1    red
2 Alvorligere vold  1154    idx08 1.108696    farve2    red
3 Alvorligere vold  1154    idx07 1.027174    farve1    red
4 Alvorligere vold  1154    idx07 1.027174    farve2    red
5 Alvorligere vold  1154    idx06 1.000000    farve1    red
6 Alvorligere vold  1154    idx06 1.000000    farve2    red

2
谢谢Shane - 我认为我最喜欢你的两个熔断解决方案。显然非常明显 - 当友好的灵魂演示它时。然而 - 我的策略从一开始就有问题。我想要的是更改绘图线条的颜色(所有“向上”线条均应为红色,所有“向下”线条均应为绿色)。这就是我最初所做的原因d$farve1 <- with(d,ifelse(idx07>idx06,"red","green")) d$farve2 <- with(d,ifelse(idx08>idx07,"red","green"))有什么想法如何实现这一点吗? - Andreas
1
很抱歉,我并不是ggplot的专家(绝对不是)。我会考虑一下。或者,您可能想在“如何制作具有方向条件的不同颜色线段的线图”等问题上开一个新的问题... - Shane
亲爱的Shane, 我认为你关于开一个新问题是正确的。我已经将这个问题标记为已回答:-) - 再次感谢。 - Andreas

1

现在,data.table的melt()函数进行了改进,通过将变量名称列表传递给"measure"参数,可以使用单个命令执行此操作。

> library(data.table)
> 
> a1 = rnorm(4)
> a2 = rnorm(4)
> b1 = rnorm(4)
> b2 = rnorm(4)
> id = 1:4
> dt = data.table(id, a1, a2, b1, b2)
> dt
   id         a1         a2         b1         b2
1:  1 -0.1651639 -0.5361429 -1.0862833  1.0398071
2:  2  0.7829436  0.2047839 -1.1182770  1.3766769
3:  3 -0.7818662 -0.6914946  0.7974077 -0.6887851
4:  4  0.3685140 -0.8519147  0.4316098 -1.4756943
> 
> melt(dt, id.vars = 'id', measure.vars = list(c('a1', 'a2'), c('b1', 'b2')),
+      value.name = c('a', 'b'))
   id variable          a          b
1:  1        1 -0.1651639 -1.0862833
2:  2        1  0.7829436 -1.1182770
3:  3        1 -0.7818662  0.7974077
4:  4        1  0.3685140  0.4316098
5:  1        2 -0.5361429  1.0398071
6:  2        2  0.2047839  1.3766769
7:  3        2 -0.6914946 -0.6887851
8:  4        2 -0.8519147 -1.4756943

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接