R语言 正在创建只有1个ID列的宽数据[重复]

gblwokeq  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(98)

此问题已在此处有答案

How to reshape data from long to wide format(14个回答)
4年前关闭。
我有一个 Dataframe ,看起来像这样:

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


这和我想要的很相似,我只是不知道如何让日期列变成多列。任何帮助或额外的阅读是赞赏。
为了澄清这是我预期的输出 Dataframe

ID date.1 date.2  9  10
   1   1        2   5  4
   2   3        4   7  6

ctzwtxfj

ctzwtxfj1#

您可以使用基数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))

n6lpvg4x

n6lpvg4x2#

以下是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是 * 偶数 * 还是 * 奇数 *。这是使用模(%%)运算符(和一些额外的数字处理)完成的。date.1 = date %% 2 * date捕获日期中的奇数,并且对于所有其他数字是0; date.2 = - (date %% 2 - 1) * date捕获偶数,而0捕获所有其他数字。
之后就直接了当了选择除date以外的所有列;将其扩展为宽格式,并再次使用ID进行总结,并删除所有NA s(group_by(ID) %>% summarise_all(list(~ sum(.[!is.na(.)]))).

相关问题