具有因子变量的 as.numeric() 的奇怪行为 - 给出与提供的数字完全不同的数字
Strange behaviour of as.numeric() with factor variable - gives completely different numbers to those supplied
我有一个数据集,我试图在其中将一个因子转换为一个数字变量,它在我第一次 运行 时似乎工作正常,但现在我已经将矢量内容更改为 as.numeric() 函数返回不同的(可能是以前的)值,而不是向量中现在的值,尽管事实上这些值似乎没有存储在任何地方。但是,如果我先转换为角色,它就可以正常工作。我使用的代码是:
rm(reprex) # ensure does not exist from previously
reprex <- data.frame(rbind(c("BT",8),c("BL", 1), c("TS",1), c("SA", 7), c("S", 5), c("LS",5), c("M",3), c("CV",3), c("CF",3), c("PE",3)))
names(reprex) <-c("Post Area", "Count")
reprex$Countnum <- as.numeric(reprex$Count) # should be same as Count
reprex$Countnum_char <- as.numeric(as.character(reprex$Count)) # is same as Count
head(reprex)
给出:
Post Area Count Countnum Countnum_char
1 BT 8 5 8
2 BL 1 1 1
3 TS 1 1 1
4 SA 7 4 7
5 S 5 3 5
6 LS 5 3 5
这是为什么?如果我在转换为数字之前将其转换为字符似乎可以工作,这样我就可以避免它,但我对为什么会发生这种情况以及 st运行gely-mapped 的位置感到困惑(我怀疑以前的版本数据框的)因子水平被存储,以便在我删除对象后它们仍然存在。
此问题涉及 R
如何理解您的流程。 Count = 1
是最小的数字,因此变成 Countnum = 1
。 Count = 3
是第二高的数字,因此因子级别为 2,这也意味着 Countnum = 2
,依此类推。实际上,您的第一个 as.numeric
所做的是采用因子水平并将因子水平转换为数字。 Countnum_char
将字符值(例如 Count = 8
是 factor level = 5
或 Count = 5
是 factor level = 3
)作为其值并将值转换为数字,而不是因子等级。
看看这里,了解为什么会发生这种情况:https://www.dummies.com/programming/r/how-to-convert-a-factor-in-r/
Dummies
网站有很多关于 R 的免费资源。
> numbers <- factor(c(9, 8, 10, 8, 9))
如果你在上面的代码片段中 运行 str()
你会得到这个输出:
> str(numbers)
Factor w/ 3 levels "8","9","10": 2 1 3 1 2
R 将值存储为 c(2, 1, 3, 1, 2),关联级别为 c(“8”, “9”, “10”)
将数字转换为字符向量时,您会收到预期的输出:
> as.character(numbers)
[1] "9" "8" "10" "8" "9"
但是,当您使用 as.numeric()
时,您将获得向量的内部级别表示的输出,而不是原始值。
做你做的事
> as.numeric(as.character(numbers))
[1] 9 8 10 8 9
正是您解决此问题的方法!在做你正在做的事情时,这是 R 的正常行为;你在这里没有犯任何我能看到的错误。
我有一个数据集,我试图在其中将一个因子转换为一个数字变量,它在我第一次 运行 时似乎工作正常,但现在我已经将矢量内容更改为 as.numeric() 函数返回不同的(可能是以前的)值,而不是向量中现在的值,尽管事实上这些值似乎没有存储在任何地方。但是,如果我先转换为角色,它就可以正常工作。我使用的代码是:
rm(reprex) # ensure does not exist from previously
reprex <- data.frame(rbind(c("BT",8),c("BL", 1), c("TS",1), c("SA", 7), c("S", 5), c("LS",5), c("M",3), c("CV",3), c("CF",3), c("PE",3)))
names(reprex) <-c("Post Area", "Count")
reprex$Countnum <- as.numeric(reprex$Count) # should be same as Count
reprex$Countnum_char <- as.numeric(as.character(reprex$Count)) # is same as Count
head(reprex)
给出:
Post Area Count Countnum Countnum_char
1 BT 8 5 8
2 BL 1 1 1
3 TS 1 1 1
4 SA 7 4 7
5 S 5 3 5
6 LS 5 3 5
这是为什么?如果我在转换为数字之前将其转换为字符似乎可以工作,这样我就可以避免它,但我对为什么会发生这种情况以及 st运行gely-mapped 的位置感到困惑(我怀疑以前的版本数据框的)因子水平被存储,以便在我删除对象后它们仍然存在。
此问题涉及 R
如何理解您的流程。 Count = 1
是最小的数字,因此变成 Countnum = 1
。 Count = 3
是第二高的数字,因此因子级别为 2,这也意味着 Countnum = 2
,依此类推。实际上,您的第一个 as.numeric
所做的是采用因子水平并将因子水平转换为数字。 Countnum_char
将字符值(例如 Count = 8
是 factor level = 5
或 Count = 5
是 factor level = 3
)作为其值并将值转换为数字,而不是因子等级。
看看这里,了解为什么会发生这种情况:https://www.dummies.com/programming/r/how-to-convert-a-factor-in-r/
Dummies
网站有很多关于 R 的免费资源。
> numbers <- factor(c(9, 8, 10, 8, 9))
如果你在上面的代码片段中 运行 str()
你会得到这个输出:
> str(numbers)
Factor w/ 3 levels "8","9","10": 2 1 3 1 2
R 将值存储为 c(2, 1, 3, 1, 2),关联级别为 c(“8”, “9”, “10”)
将数字转换为字符向量时,您会收到预期的输出:
> as.character(numbers)
[1] "9" "8" "10" "8" "9"
但是,当您使用 as.numeric()
时,您将获得向量的内部级别表示的输出,而不是原始值。
做你做的事
> as.numeric(as.character(numbers))
[1] 9 8 10 8 9
正是您解决此问题的方法!在做你正在做的事情时,这是 R 的正常行为;你在这里没有犯任何我能看到的错误。