【问题标题】:Removing S3 labels in a list删除列表中的 S3 标签
【发布时间】:2021-06-04 05:45:52
【问题描述】:

我正在处理一个大型数据集下载数据集,最终目标是连接许多数据帧。

在过去一周左右的时间里,由于“标记”与“字符”数据类型不兼容,我一直无法加入数据框。最终,我想将我的函数映射到列表中多个数据框中的同一个变量。

每个 df 的结构如下(编辑以更改变量/属性名称,因为我无法共享数据)。我在这里使用的感兴趣的变量是“CODE”:

structure(list(VAR1 = structure(c(val, val, val, val, val, val), .Label = c("a", 
"b", "c", "d"), class = "factor"), ID = c(1, 
2, 3, 4, 5, 6), CODE = structure(c("c1", "c1", 
"c1", "c1", "c1", "c1"), label = "instance code", units = "-4", class = c("labelled", 
"character")), ...

我对 R/RStudio 还是比较陌生,所以我想了一会儿,我的问题是在整个列表中进行映射,但是当我选择一个元素来删除标签时,它仍然不起作用。尽管事实上当我使用 get_label 时,标签会显示出来(下面的函数),但几乎就像 R 不知道标签在那里一样。

get_label(my.list[["my.df"]][["my.variable"]]

我尝试了以下方法(我将其显示为使用单个变量而不是整个列表,这就是我过去几天一直在尝试的方式):

  1. 类函数。有趣的是,当我回电时,它说课程是性格;但是,当我查看数据框时,该类仍然显示“字符 [# of elements] (S3: labelled, character)”
class(my.list[["my.df"]][["my.variable"]] <- "character"
  1. remove_label 函数
remove_label(my.list[["my.df"]][["my.variable"]]
  1. 非类函数。这一次适用于一个变量,但没有映射到整个列表,因此我将我的映射代码包括在内,以防在这种情况下出现问题。
## for one variable
unclass(my.list[["my.df"]][["my.variable"]])

## for entire list
my.list %>%
map_at("my.variable", ~ unclass)

## I also tried map in case it was a map_at issue--still didn't work.
  1. zap_label
zap_label(my.list[["my.df"]][["my.variable"]])
  1. 将属性设置为空
attr(my.list[["my.df"]][["my.variable"]], "label") <- NULL
  1. as.character
as.character(my.list[["my.df"]][["my.variable"]])

有人有什么想法吗?这可能是 R 中的一个错误,还是只是我对 R 显示的相对缺乏经验?

我还尝试修改这些函数,以防我误解了标签并且它是值标签而不是导致问题的变量标签。不是!

感谢您的帮助!

【问题讨论】:

  • 嗨 sidneyb!我认为帮助您的最简单方法是显示一些数据。将dput(head(my.df)) 添加到您的问题中。
  • 无论如何.. 你试过as.character 吗?
  • 嘿@Edo!我添加了该信息。我试过 as.character,但也没有用。以防万一,重试了下,还是不行。更新了帖子以反映这一点。
  • @sydneyb 你不应该缩短 dput 的输出,否则它将变得无用。阅读我们的how-to-make-a-great-r-reproducible-example

标签: r class label attr


【解决方案1】:

您可以使用labelled package 允许设置/删除标签:

library(labelled)


my.df = data.frame(test = "a test")
labelled::var_label(my.df) <- list(test='a test label')

var_label(my.df$test)
#> [1] "a test label"

my.list <-list(my.df = my.df)

var_label(my.list[["my.df"]][["test"]])
#> [1] "a test label"

my.list[["my.df"]][["test"]] <- remove_labels(my.list[["my.df"]][["test"]])

var_label(my.list[["my.df"]][["test"]])
#> NULL

my.list[["my.df"]][["test"]]
#> [1] "a test"

【讨论】:

  • 谢谢!确实如此!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 2021-10-19
  • 2021-09-24
  • 2011-08-20
相关资源
最近更新 更多