如何将带标签的列从宽格式转换为长格式并保留标签?[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