根据列从宽到长数据分配值

Wide To Long Data Assigning Values Based on Columns

我正在尝试将宽数据集转换为长数据集(我相信这是谈论它的正确方式),这应该是相当直接的。但是,我正在尝试对列中的数字进行排序和赋值。通过下面的基本示例更容易理解:

df <- data.frame(respondent = c( "One", "Two", "Three"),
                 minus.four = c(20, 21, 22),
                 minus.three = c(21, 20, 20),
                 minus.two = c(22, 22, 21 ))
df
respondent minus.four minus.three minus.two
1        One         20          21        22
2        Two         21          20        22
3      Three         22          20        21

我希望将它从宽改为长(我认为这是正确的)并且我希望它看起来像这样:

  value One Two Three
1    20  -4  -3    -3
2    21  -3  -4    -2
3    22  -2  -2    -4

20-22 的值基于它们最初所在的列,应按 respondent 列进一步排序。

希望这是有道理的,感谢您的指导。

您的预期输出仍然是“宽”数据,但如果将数据暂时重塑为长数据,则执行您感兴趣的转换会更容易完成。一旦您的列名称被放置在长“名称”列中,用 case_when 替换数值就相对容易了,然后重塑为宽格式。

library(tidyverse)

df %>% 
  pivot_longer(-respondent) %>% 
  mutate(value_numeric = case_when(
    name == 'minus.four' ~ -4,
    name == 'minus.three' ~ -3,
    name == 'minus.two' ~ -2
  )) %>% 
  select(-name) %>% 
  pivot_wider(values_from = value_numeric, names_from = respondent)

  value   One   Two Three
  <dbl> <dbl> <dbl> <dbl>
1    20    -4    -3    -3
2    21    -3    -4    -2
3    22    -2    -2    -4