以特定方式转换数据框列名称

时间:2020-09-18 21:24:18

标签: r dataframe

我有一个数据框:

ID   value  is_valid
A    134     TRUE
B    345     FALSE
C    131     TRUE

我想将它做成9列的一行,所以每个ID都会有相同的列。因此,所需的结果必须如下所示:

A_ID   A_value  A_is_valid  B_ID   B_value  B_is_valid  C_ID   C_value  C_is_valid
A        134     TRUE        B       345     FALSE       C       131     TRUE

我该怎么做?我不知道

2 个答案:

答案 0 :(得分:1)

我们可以创建一个序列列并使用pivot_wider

library(dplyr)
library(tidyr)
df1 %>% 
    mutate(rn = LETTERS[row_number()]) %>% 
     pivot_wider(names_from = rn, values_from = -rn)
# A tibble: 1 x 9
#  ID_A  ID_B  ID_C  value_A value_B value_C is_valid_A is_valid_B is_valid_C
#  <chr> <chr> <chr>   <int>   <int>   <int> <lgl>      <lgl>      <lgl>     
#1 A     B     C         134     345     131 TRUE       FALSE      TRUE      

数据

df1 <- structure(list(ID = c("A", "B", "C"), value = c(134L, 345L, 131L
), is_valid = c(TRUE, FALSE, TRUE)), class = "data.frame", row.names = c(NA, 
-3L))

答案 1 :(得分:1)

这是使用reshape

的基本R选项
reshape(
  cbind(P = 1, Q = df$ID, df),
  direction = "wide",
  idvar = "P",
  timevar = "Q"
)[-1]

给出

  ID.A value.A is_valid.A ID.B value.B is_valid.B ID.C value.C is_valid.C
1    A     134       TRUE    B     345      FALSE    C     131       TRUE

数据

> dput(df)
structure(list(ID = c("A", "B", "C"), value = c(134L, 345L, 131L
), is_valid = c(TRUE, FALSE, TRUE)), class = "data.frame", row.names = c(NA,
-3L))