如何将带标签的列从宽格式转换为长格式并保留标签?[R]
我正在使用带有标签列的数据集(即带有标签的变量)。数据集的格式很宽,如下所示:如何将带标签的列从宽格式转换为长格式并保留标签?[R],r,R,我正在使用带有标签列的数据集(即带有标签的变量)。数据集的格式很宽,如下所示: df <- data.frame("Trust" = c(1, 2, 3, 2, 3), "Evaluation" = c(2, 3, 1, 1, 3)) df %>% pivot_longer(cols=everything(), names_to="Question", values_to="
df <- data.frame("Trust" = c(1, 2, 3, 2, 3),
"Evaluation" = c(2, 3, 1, 1, 3))
df %>% pivot_longer(cols=everything(), names_to="Question", values_to="Value") %>%
left_join(df %>% look_for() %>% select(Question=variable, Label=label), by="Question")
理想情况下,我希望为变量的名称创建一列,为标签创建另一列,为该变量的值创建另一列。我很抱歉,因为我认为代码不是完全可复制的,但我认为我的意思很清楚
有没有办法做到这一点?我试图用pivot_从tidyr开始做这件事,但由于列的标签性质,我遇到了问题。我想如果我首先将变量转换成因子,我可以做到,但是我会丢失标签名称,这不是我想要实现的
如果tidyverse能提供解决方案,那就太棒了。非常感谢大家 您的问题可能与 下面呢
df如果我理解正确,您的数据帧是使用标记的
包创建的,例如
df <- data.frame("Trust" = c(1, 2, 3, 2, 3), "Evaluation" = c(2, 3, 1, 1, 3))
var_label(df$Trust) <- "how much do you trust X"
var_label(df$Evaluation) <- "how do you evaluate Y"
基于此,可以获得如下所示的所需输出:
df <- data.frame("Trust" = c(1, 2, 3, 2, 3),
"Evaluation" = c(2, 3, 1, 1, 3))
df %>% pivot_longer(cols=everything(), names_to="Question", values_to="Value") %>%
left_join(df %>% look_for() %>% select(Question=variable, Label=label), by="Question")
我希望这会有帮助
更新
为了包含值的标签,下面的代码将起作用(尽管有点复杂)
(产出)
##一个tible:10x4
#问题值标签值标签
#
#1信任1你信任多少X不信任
#2信任2你信任X多少
#3信任3你信任多少X绝对信任
#4信任2你信任X多少
#5信任3你信任多少X绝对信任
#6评估2你如何评估你的好坏
#7评估3你如何评估Y好
#8评估1你如何评估Y Bad
#9评估1你如何评估Y Bad
#10评价3你如何评价Y好
如果您提供一个带有标签数据本身的示例,这样我们就可以在此基础上测试我们的答案,这将非常有帮助。这个答案非常棒!不过我有一点麻烦。为简单起见,我没有说在原始df中答案值也被标记(因此1是数字(“双”)并被标记(例如,“坏”);3是数字并被标记(3-“好”)。我想这就是为什么我在长时间使用pivot_时会出现错误的原因,具体来说:错误:由于精度损失,无法从转换为。*位置:7、42、43、77、83、89、100…值标记为``但不标记为`。知道如何解决这个问题吗?非常感谢!我实际上找到了一个对我有效的解决方案(它消除了重复的行,但这不是我真正的问题)。对任何感兴趣的人来说,它涉及使用函数look_for_to_long_format(),如look_for%>%look_for_to_long_format())我根据您的评论更新了我的答案。但我没有通过pivot\u longer
得到错误,即使这些值已标记,我也不确定是什么原因导致了您的错误。
df %>% pivot_longer(cols=everything(), names_to="Question", values_to="Value") %>%
left_join(df %>% look_for() %>% select(Question=variable, Label=label), by="Question")
left_join(
df %>% pivot_longer(cols=everything(), names_to="Question", values_to="Value") %>% nest(df=-Question),
df %>% look_for() %>% lookfor_to_long_format() %>% select(Question=variable, Label=label, ValueLabel=value_labels) %>%
mutate(ValueLabel=str_split(ValueLabel, "] "),
Value=map_int(ValueLabel, ~ .[[1]] %>% str_replace("\\[", "") %>% as.integer()),
ValueLabel=map_chr(ValueLabel, ~ .[[2]])) %>% nest(label=-Question),
by="Question"
) %>% mutate(df=map2(df, label, ~ left_join(.x, .y, by="Value"))) %>% select(-label) %>% unnest(cols=df)
## A tibble: 10 x 4
# Question Value Label ValueLabel
# <chr> <dbl> <chr> <chr>
# 1 Trust 1 how much do you trust X No trust
# 2 Trust 2 how much do you trust X Somewhat trust
# 3 Trust 3 how much do you trust X Absolute trust
# 4 Trust 2 how much do you trust X Somewhat trust
# 5 Trust 3 how much do you trust X Absolute trust
# 6 Evaluation 2 how do you evaluate Y Neither good nor bad
# 7 Evaluation 3 how do you evaluate Y Good
# 8 Evaluation 1 how do you evaluate Y Bad
# 9 Evaluation 1 how do you evaluate Y Bad
#10 Evaluation 3 how do you evaluate Y Good