R 使用两个分组列扩展数据帧

R 使用两个分组列扩展数据帧,r,dplyr,spread,R,Dplyr,Spread,我的教师数据集如下: df <- data.frame( teacher = c("A", "A", "A", "A", "B", "B", "C", 'C'), seg = c("1", '1', "2", "2", "1", "2", "1", "2"), claim = c( "beth", 'john', 'john', 'beth', 'summer', 'summer', "hannah", "hann

我的教师数据集如下:

df <- data.frame(
  teacher = c("A", "A", "A", "A", "B", "B", "C", 'C'),
  seg = c("1", '1', "2", "2", "1", "2", "1", "2"),
  claim = c(
    "beth",
    'john',
    'john',
    'beth',
    'summer',
    'summer',
    "hannah",
    "hannah"
  )
)
理想情况下,我希望像这样传播我的数据集:

期望输出


关于如何使用spread或pivot_wide实现这一点,有什么想法吗?问题是这里有两个分组变量:教师和段。有些教师可能有多个相同的片段,但有些教师没有

一个选项是创建一个按“teacher”、“seg”分组的序列列,然后使用pivot\u


您还可以使用一个基本的R方式,它具有强大的重塑功能和一些小的数据准备

# find duplicate values
dups <- duplicated(df[, 1:2])
# assign new names to duplicates
df[dups, 2] <- paste0(df[dups, 2], "double")

# use base r reshape function that automatically builds suitable names
wide <- reshape(df, v.names = "claim", idvar = "teacher",
                timevar = "seg", direction = "wide", sep = "")

# change varnames to the desired output
names(wide) <- gsub("claim", "seg", names(wide))
wide

尝试librarydata.table;dcastsetDTdf,teacher~paste0seq_,seg+rowidtteacher嘿,我喜欢你的方法,但你为什么不把它作为一个恰当的答案贴出来呢我试图理解这行代码,mutatesegN=c,double[row\u number]。我看到它在教师行中填充了两个相同段的行,但我不知道如何填充@这里的新手,每组有两个元素,所以row_number返回一个索引1,2。当我们做c,double时,它只使用1,2作为位置索引进行替换
library(data.table)
df %>% 
  mutate(seg = str_c('seg', c('', '_double')[rowid(teacher, seg)], seg)) %>%
   pivot_wider(names_from = seg, values_from = claim)
   #or use spread
   # spread(seg, claim)
#  teacher   seg1 seg_double1   seg2 seg_double2
#1       A   beth        john   john        beth
#2       B summer        <NA> summer        <NA>
#3       C hannah        <NA> hannah        <NA>
# find duplicate values
dups <- duplicated(df[, 1:2])
# assign new names to duplicates
df[dups, 2] <- paste0(df[dups, 2], "double")

# use base r reshape function that automatically builds suitable names
wide <- reshape(df, v.names = "claim", idvar = "teacher",
                timevar = "seg", direction = "wide", sep = "")

# change varnames to the desired output
names(wide) <- gsub("claim", "seg", names(wide))
wide