R语言 将多个列聚集到一个键和两个值中

mwkjh3gx  于 2023-07-31  发布在  其他
关注(0)|答案(5)|浏览(94)

我需要将多个列收集到一个键和两个值中。我在这里遇到了很多类似的问题,但我不能重现的答案,因为他们是非常具体的,没有很好地解释imho。如果有一个,回答我的问题,我很高兴有一个链接。
实施例df:

df <- data.frame(semester=rep(1:6),
                 Anna_try1=c(1,2,2,1,4,2),
                 Lena_try1=c(3,4,2,3,2,1),
                 Anna_try2=c(2,3,1,2,1,4),
                 Lena_try2=c(2,4,2,1,5,2))

字符串
看起来像这样:


的数据
我需要这样的东西:

v09wglhw

v09wglhw1#

可以使用tidyr::pivot_longer

tidyr::pivot_longer(df, 
                    cols = -semester, 
                    names_to = c('name', '.value'),
                    names_sep = '_')

#   semester name   try1  try2
#      <int> <chr> <dbl> <dbl>
# 1        1 Anna      1     2
# 2        1 Lena      3     2
# 3        2 Anna      2     3
# 4        2 Lena      4     4
# 5        3 Anna      2     1
# 6        3 Lena      2     2
# 7        4 Anna      1     2
# 8        4 Lena      3     1
# 9        5 Anna      4     1
#10        5 Lena      2     5
#11        6 Anna      2     4
#12        6 Lena      1     2

字符串

0dxa2lsx

0dxa2lsx2#

如果你有更好的列名,你可以很容易地使用reshape
但我们可以先解决这个问题。

names(df)[-1] <- sapply(strsplit(names(df)[-1], "_"), function(x) 
  paste(rev(x), collapse="."))
names(df)
# [1] "semester"  "try1.Anna" "try1.Lena" "try2.Anna" "try2.Lena"

df <- reshape(df, timevar="name", varying=2:5, direction="long")
df
#        semester name try1 try2 id
# 1.Anna        1 Anna    1    2  1
# 2.Anna        2 Anna    2    3  2
# 3.Anna        3 Anna    2    1  3
# 4.Anna        4 Anna    1    2  4
# 5.Anna        5 Anna    4    1  5
# 6.Anna        6 Anna    2    4  6
# 1.Lena        1 Lena    3    2  1
# 2.Lena        2 Lena    4    4  2
# 3.Lena        3 Lena    2    2  3
# 4.Lena        4 Lena    3    1  4
# 5.Lena        5 Lena    2    5  5
# 6.Lena        6 Lena    1    2  6

字符串

mfpqipee

mfpqipee3#

尝试整形为长,将变量分离为所需的新值,然后整形为宽。下面的代码使用tidyverse函数:

library(tidyverse)
#Code
df <- df %>% pivot_longer(-semester) %>%
  separate(name,c('name','try'),sep = '_') %>%
  mutate(try=paste0('grade_',try)) %>%
  pivot_wider(names_from = try,values_from=value) %>%
  arrange(name,semester)

字符串
输出量:

# A tibble: 12 x 4
   semester name  grade_try1 grade_try2
      <int> <chr>      <dbl>      <dbl>
 1        1 Anna           1          2
 2        2 Anna           2          3
 3        3 Anna           2          1
 4        4 Anna           1          2
 5        5 Anna           4          1
 6        6 Anna           2          4
 7        1 Lena           3          2
 8        2 Lena           4          4
 9        3 Lena           2          2
10        4 Lena           3          1
11        5 Lena           2          5
12        6 Lena           1          2

8yoxcaq7

8yoxcaq74#

这不是最优雅的解决方案,但它可以完成工作:

library(data.table)
library(stringr)

df1 <- setDT(df[, -grep("try1", colnames(df))])
df2 <- setDT(df[, -grep("try2", colnames(df))])

melted1 <- melt(df1, id.vars=c("semester"), variable.name = "name", value.name = "grade_try2")
melted2 <- melt(df2, id.vars=c("semester"), variable.name = "name", value.name = "grade_try1")

melted1$name <- str_sub(melted1$name, -str_length(melted1$name), -6)
melted2$name <- str_sub(melted2$name, -str_length(melted2$name), -6)

final <- melted2[melted1, on = .(semester = semester, name = name)]

字符串

kmpatx3s

kmpatx3s5#

我们可以使用meltdata.tablepatterns

library(data.table)
melt(setDT(df), measure = patterns('try1', 'try2'),
     value.names = c('grade_try1', 'grade_try2'))

字符串

相关问题