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