R:宽到长格式,适用于具有一行和>250列的 Dataframe

k2fxgqgv  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(104)

我正在尝试获取长格式的 Dataframe 。目前,它是一个有1个观测值和〉250个变量的 Dataframe ,看起来像这样:
| 用户0标识|用户0名称|用户0性别|用户1标识|用户1名称|用户1性别|用户2标识|用户2名称|用户2性别|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 十六|米勒|雌性|五十二|铁匠|男性|三十三|坦率|雌性|
同时,我只想创建一个 Dataframe ,如下所示:
| 身份证|姓名|性|
| - ------|- ------|- ------|
| 十六|米勒|雌性|
| 五十二|铁匠|男性|
| 三十三|坦率|雌性|
我已经尝试过通过应用以下代码来重命名df中的列名以使其匹配

names(df) <- sub('^users_', '', names(df))
names(df) <- sub('^[0-9.]+', '', names(df))
names(df) <- sub('^_', '', names(df))

之后,我一直试图使用melt将其转换为长格式,结果要么乘以obs,要么完全混淆了 Dataframe 。

df <- melt(setDT(df), id.vars = c("id","name"), variable.name = "data")

df <- melt(df, id.vars=c("id", "name", "sex"))

这是我第一次在stackoverflow上提问,所以任何关于如何让未来的问题更容易理解的建议都是非常受欢迎的!感谢任何花时间阅读本文的人。

des4xlb0

des4xlb01#

library(tidyr)

pivot_longer(
  df,
  cols = everything(),
  names_to = c(".value"),
  names_pattern = "user_\\d+_(.*)"
)
# A tibble: 3 × 3
     id name   sex   
  <int> <chr>  <chr> 
1    16 miller female
2    52 smith  male  
3    33 frank  female

其中df为:

df <- read.table(text = 
'user_0_id  user_0_name user_0_sex  user_1_id   user_1_name user_1_sex  user_2_id   user_2_name user_2_sex
16  miller  female  52  smith   male    33  frank   female
', header = TRUE)
ztyzrc3y

ztyzrc3y2#

我将使用tidyr(https://tidyr.tidyverse.org/reference/pivot_longer.html)包中的pivot_longger函数

longdf <- widedf %>% pivot_longer(cols=c("variable1", "variable2", 
                                 "variable3", "variable4"),
                    names_to='newvariablename',
                    values_to='newvaluenames')

这可能是一个更长的方法,首先你需要对一个变量,如性别,然后再对其他类的变量,如姓名,也许有人会知道一个更快的方法来做。

相关问题