尝试将一些标签数据转换为一个展开的行,其中名称由连接到“by”列的值的列名形成...以紧凑/优雅的方式...
MWE更容易,它使用data.table但可以是任何东西(尽管data.table首选):
library(data.table)
# input
bar <- data.table(c1 = c(1L, 2L), c2 = c(3L, 4L), c3 = c("aa", "bb"))
# output
baz <- data.table(c1_aa = 1L, c1_bb = 2L, c2_aa = 3L, c3_bb = 4L)
所以输入是:
> bar
c1 c2 c3
1: 1 3 aa
2: 2 4 bb
并且所需的输出是:
> baz
c1_aa c1_bb c2_aa c3_bb
1: 1 2 3 4
答案 0 :(得分:3)
这是@ useR回答的data.table模拟
dcast(melt(bar, id="c3"), . ~ variable + c3)
由于dcast
默认值(在列排序和使用_
作为分隔符时),它恰好很短。
答案 1 :(得分:2)
不是data.table
,但与dplyr
+ tidyr
配合得很好:
library(dplyr)
library(tidyr)
bar %>%
gather(variable, value, c1:c2) %>%
unite(variable, variable, c3, sep = "_") %>%
spread(variable, value)
<强>结果:强>
c1_aa c1_bb c2_aa c2_bb
1 1 2 3 4