因子强制为数据框中的 *each* 行生成数字标签,而不是指定的标签
Factor coercion produces a numeric label for *each* row in data frame, not the labels specified
我正在尝试将数据框中的数字列强制转换为因子。强制转换正常,除了我指定的标签不是我指定的标签,而是为数据框的每一行获取一个数字标签。没有错误消息。
我尝试过 tidyverse 和 base 方法;在强制转换为因子之前将目标向量强制转换为字符(甚至整数); 运行 在 tibble 而不是数据框上使用相同的代码,以防万一它与行名称有关。我在这里和互联网上其他与 R 相关的部分进行了搜索。
我确信我在这里遗漏了一些明显的东西,但是当一个人看一个问题太久时,我就是看不到它。
df <- data.frame("a" = c(1, 2, 2), "b" = c(2, 1, 1), row.names = NULL, stringsAsFactors = FALSE)
df$a <- factor(df$a, levels = c("1", "2"), labels = c("yes", "no"))
# coercion to factor worked:
class(df$a)
#> [1] "factor"
typeof(df$a)
#> [1] "integer"
levels(df$a)
#> [1] "yes" "no"
labels(df$a) # same as no. rows in df. Add rows and more labels appear.
#> [1] "1" "2" "3"
df$a
#> [1] yes no no
#> Levels: yes no
由 reprex 包 (v0.3.0) 创建于 2020-09-24
我们可以使用 dput
:
查看 df$a
的结构
dput(df$a)
#> structure(c(1L, 2L, 2L), .Label = c("yes", "no"), class = "factor")
可以看到确实是一个标签合适的因素。您正在使用的函数 labels
没有 return 因子的 .Label
元素。它与因素完全无关,我想你只是被名字弄糊涂了。 labels
函数只是给出一个与输入向量长度相同的数字字符向量,无论 class 是什么。例如:
labels(5:10)
#> [1] "1" "2" "3" "4" "5" "6"
所以你新创建的因子没有问题。 levels
函数相当混乱 return 是因子的 .Label
分量。
因素实际上并没有名为“级别”的命名组件。函数 factor
中的 levels
参数有时仅在从字符或数字向量创建因子时使用,以便我们指定我们感兴趣的向量元素。在您的情况下, [= factor
调用的 20=] 参数是完全多余的:
df <- data.frame("a" = c(1, 2, 2), "b" = c(2, 1, 1), row.names = NULL)
factor(df$a, labels = c("yes", "no"))
#> [1] yes no no
#> Levels: yes no
我们只会在想要降低一些关卡时使用它:
factor(df$a, levels = "2", labels = "no")
#> [1] <NA> no no
#> Levels: no
我想您可能一直在寻找:
as.numeric(df$a)
#> [1] 1 2 2
恢复原来的数字。
但是,没有错误。您的强制是正确的,并且完全按预期工作。只有您对 labels
函数应该做什么的理解才会导致问题。
我正在尝试将数据框中的数字列强制转换为因子。强制转换正常,除了我指定的标签不是我指定的标签,而是为数据框的每一行获取一个数字标签。没有错误消息。
我尝试过 tidyverse 和 base 方法;在强制转换为因子之前将目标向量强制转换为字符(甚至整数); 运行 在 tibble 而不是数据框上使用相同的代码,以防万一它与行名称有关。我在这里和互联网上其他与 R 相关的部分进行了搜索。
我确信我在这里遗漏了一些明显的东西,但是当一个人看一个问题太久时,我就是看不到它。
df <- data.frame("a" = c(1, 2, 2), "b" = c(2, 1, 1), row.names = NULL, stringsAsFactors = FALSE)
df$a <- factor(df$a, levels = c("1", "2"), labels = c("yes", "no"))
# coercion to factor worked:
class(df$a)
#> [1] "factor"
typeof(df$a)
#> [1] "integer"
levels(df$a)
#> [1] "yes" "no"
labels(df$a) # same as no. rows in df. Add rows and more labels appear.
#> [1] "1" "2" "3"
df$a
#> [1] yes no no
#> Levels: yes no
由 reprex 包 (v0.3.0) 创建于 2020-09-24
我们可以使用 dput
:
df$a
的结构
dput(df$a)
#> structure(c(1L, 2L, 2L), .Label = c("yes", "no"), class = "factor")
可以看到确实是一个标签合适的因素。您正在使用的函数 labels
没有 return 因子的 .Label
元素。它与因素完全无关,我想你只是被名字弄糊涂了。 labels
函数只是给出一个与输入向量长度相同的数字字符向量,无论 class 是什么。例如:
labels(5:10)
#> [1] "1" "2" "3" "4" "5" "6"
所以你新创建的因子没有问题。 levels
函数相当混乱 return 是因子的 .Label
分量。
因素实际上并没有名为“级别”的命名组件。函数 factor
中的 levels
参数有时仅在从字符或数字向量创建因子时使用,以便我们指定我们感兴趣的向量元素。在您的情况下, [= factor
调用的 20=] 参数是完全多余的:
df <- data.frame("a" = c(1, 2, 2), "b" = c(2, 1, 1), row.names = NULL)
factor(df$a, labels = c("yes", "no"))
#> [1] yes no no
#> Levels: yes no
我们只会在想要降低一些关卡时使用它:
factor(df$a, levels = "2", labels = "no")
#> [1] <NA> no no
#> Levels: no
我想您可能一直在寻找:
as.numeric(df$a)
#> [1] 1 2 2
恢复原来的数字。
但是,没有错误。您的强制是正确的,并且完全按预期工作。只有您对 labels
函数应该做什么的理解才会导致问题。