我的数据框如下所示:
COL1 COL2 Value
A A1 0.9
A A2 1.8
A A3 0.2
B B1 4.6
B B2 0.9
B A1 8.4
我想重新格式化上面的数据框,使其看起来如下所示,以便我根据COL1的所有可能组合及其相应的值:
COL1 COL2 COL3 VALUE_1 VALUE_2
A A1 A2 0.9 1.8
A A1 A3 0.9 0.2
A A2 A3 1.8 0.2
B B1 B2 4.6 0.9
B B1 A1 4.6 8.4
B B2 A1 0.9 8.4
有人知道一个简单的方法吗?谢谢!
答案 0 :(得分:2)
使用此数据:
df = structure(list(COL1 = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("A",
"B"), class = "factor"), COL2 = structure(c(1L, 2L, 3L, 4L, 5L,
1L), .Label = c("A1", "A2", "A3", "B1", "B2"), class = "factor"),
Value = c(0.9, 1.8, 0.2, 4.6, 0.9, 8.4)), .Names = c("COL1",
"COL2", "Value"), class = "data.frame", row.names = c(NA, -6L
))
我们可以利用因子排序进行重复数据删除并使用dplyr
:
# create second dataframe with new names
df2 = df
names(df2) = c("COL1", "COL3", "VALUE2")
df %>% left_join(df2) %>%
filter(as.numeric(COL2) < as.numeric(COL3))
COL1 COL2 Value COL3 VALUE2
1 A A1 0.9 A2 1.8
2 A A1 0.9 A3 0.2
3 A A2 1.8 A3 0.2
4 B B1 4.6 B2 0.9
5 B A1 8.4 B1 4.6
6 B A1 8.4 B2 0.9
您可以根据需要使用select
重新排列和重命名列。
答案 1 :(得分:1)
使用base R
,我们可以进行自我合并和子集
subset(merge(df, df, by.x= "COL1", by.y = "COL1"), as.numeric(COL2.x) < as.numeric(COL2.y))
# COL1 COL2.x Value.x COL2.y Value.y
#2 A A1 0.9 A2 1.8
#3 A A1 0.9 A3 0.2
#6 A A2 1.8 A3 0.2
#11 B B1 4.6 B2 0.9
#16 B A1 8.4 B1 4.6
#17 B A1 8.4 B2 0.9
我们可以使用colnames