创建只有 1 个 ID 列的宽数据
Creating wide data that has only 1 ID column
我有一个如下所示的数据框:
ID Code_Type Code date
1 10 4 1
1 9 5 2
2 10 6 3
2 9 7 4
我希望它看起来像这样:
ID date.1 date.2 9 10
1 1 2 5 4
2 3 4 7 6
不同的日期在同一行中有不同的列。
我目前的代码是这样的:
#Example df
df <- data.frame("ID" = c(1,1,2,2),
"Code_Type" = c(10,9,10,9),
"Code" = c(4,5,6,7),
"date"= c(1,2,3,4))
spread(df, Code_Type,Code)
这输出:
ID date 9 10
1 1 NA 4
1 2 5 NA
2 3 NA 6
2 4 7 NA
这和我想要的相似我只是不知道如何将日期列变成多列。感谢任何帮助或额外阅读。
澄清一下这是我预期的输出数据框
ID date.1 date.2 9 10
1 1 2 5 4
2 3 4 7 6
这是一个 dplyr
/ tidyr
替代方案:
df %>% mutate(date.1 = date %% 2 * date) %>% mutate(date.2 = - (date %% 2 - 1) * date) %>% select(-date) %>% spread(Code_Type, Code) %>% group_by(ID) %>% summarise_all(list(~ sum(.[!is.na(.)])))
# A tibble: 2 x 5
ID date.1 date.2 `9` `10`
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 2 5 4
2 2 3 4 7 6
想法是将 date
列拆分为两列,无论 date
是 even 还是 odd .这是使用模 (%%
) 运算符(以及一些额外的数字运算)完成的。 date.1 = date %% 2 * date
捕获日期中的奇数,并且 0
用于所有其他; date.2 = - (date %% 2 - 1) * date
捕捉偶数,0
捕捉所有其他数字。
之后就很简单了:select 除 date
之外的所有列;将它传播到宽格式,再次有点棘手,通过 ID
总结并删除所有 NA
s (group_by(ID) %>% summarise_all(list(~ sum(.[!is.na(.)])))
.
您可以使用基础 R 中的 reshape
。
reshape(dat, idvar=c("ID"), timevar="Code_Type", direction="wide")
# ID Code.10 date.10 Code.9 date.9
# 1 1 4 1 5 2
# 3 2 6 3 7 4
数据
dat <- structure(list(ID = c(1, 1, 2, 2), Code_Type = c(10, 9, 10, 9
), Code = c(4, 5, 6, 7), date = c(1, 2, 3, 4)), class = "data.frame", row.names = c(NA,
-4L))
我有一个如下所示的数据框:
ID Code_Type Code date
1 10 4 1
1 9 5 2
2 10 6 3
2 9 7 4
我希望它看起来像这样:
ID date.1 date.2 9 10
1 1 2 5 4
2 3 4 7 6
不同的日期在同一行中有不同的列。
我目前的代码是这样的:
#Example df
df <- data.frame("ID" = c(1,1,2,2),
"Code_Type" = c(10,9,10,9),
"Code" = c(4,5,6,7),
"date"= c(1,2,3,4))
spread(df, Code_Type,Code)
这输出:
ID date 9 10
1 1 NA 4
1 2 5 NA
2 3 NA 6
2 4 7 NA
这和我想要的相似我只是不知道如何将日期列变成多列。感谢任何帮助或额外阅读。
澄清一下这是我预期的输出数据框
ID date.1 date.2 9 10
1 1 2 5 4
2 3 4 7 6
这是一个 dplyr
/ tidyr
替代方案:
df %>% mutate(date.1 = date %% 2 * date) %>% mutate(date.2 = - (date %% 2 - 1) * date) %>% select(-date) %>% spread(Code_Type, Code) %>% group_by(ID) %>% summarise_all(list(~ sum(.[!is.na(.)])))
# A tibble: 2 x 5
ID date.1 date.2 `9` `10`
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 2 5 4
2 2 3 4 7 6
想法是将 date
列拆分为两列,无论 date
是 even 还是 odd .这是使用模 (%%
) 运算符(以及一些额外的数字运算)完成的。 date.1 = date %% 2 * date
捕获日期中的奇数,并且 0
用于所有其他; date.2 = - (date %% 2 - 1) * date
捕捉偶数,0
捕捉所有其他数字。
之后就很简单了:select 除 date
之外的所有列;将它传播到宽格式,再次有点棘手,通过 ID
总结并删除所有 NA
s (group_by(ID) %>% summarise_all(list(~ sum(.[!is.na(.)])))
.
您可以使用基础 R 中的 reshape
。
reshape(dat, idvar=c("ID"), timevar="Code_Type", direction="wide")
# ID Code.10 date.10 Code.9 date.9
# 1 1 4 1 5 2
# 3 2 6 3 7 4
数据
dat <- structure(list(ID = c(1, 1, 2, 2), Code_Type = c(10, 9, 10, 9
), Code = c(4, 5, 6, 7), date = c(1, 2, 3, 4)), class = "data.frame", row.names = c(NA,
-4L))