我想知道 R 中是否有任何函数可以显示因子变量的级别和值的映射?例如我期望这样的输出:
Fac_level:“是”-值:“1”,
Fac_level: "no" - 值: "2"等
这对于第一次处理未知数据集时非常有帮助。
我有一个数据框,其中包含 \xe2\x80\x93 以及其他 \xe2\x80\x93\xc2\xa0 两列引用同一事物。一个是另一个的数字 ID,它被解析为一个因素。
\n\ndf = data.frame(\n "id" = c(5, 3, 1, 2, 4, 5),\n "val" = factor(c("a", "b", "c", "d", "e", "a")),\n "someColumn" = c(13, 38, 91, 83, 19)\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n由于还有其他附加列,这些因子水平中存在重复项。现在,因子水平按字母顺序排序,无论它们在数据框中出现的顺序如何。
\n\n问题是:我想根据因子的 ID 对因子的级别进行排序。这样,使用它会变得更容易,尤其是在绘图中。我不想更改标签。我可以将级别更改为实际 ID,但我认为没有必要。
\n\n在我发现的其他示例中,建议是这样做:
\n\nfactor(df$val, levels = df$val[order(df$id)])\n
Run Code Online (Sandbox Code Playgroud)\n\n但是,这对我来说不起作用,因为存在重复项:
\n\nWarning message:\nIn `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels, :\n duplicated levels in factors are deprecated\n
Run Code Online (Sandbox Code Playgroud)\n\n我不想删除原始数据中的行,因为我不想丢弃数据或更改其顺序,并继续使用数据框。我可以通过其他方式消除警告和重复的级别吗?或者我应该完全使用另一种方法?
\n我需要在R中找到序数(即有序因子)的中位数.
我在标准库中找不到这样做的方法,所以我提出了以下笨重的解决方案:
ordinal.median <- function(x){
lbls <- levels(x)
new.vars <- c(NA, 1:length(lbls))
new.vars[1] <- median(as.numeric(x))
return(factor(new.vars, labels=lbls, ordered=T)[1])
}
Run Code Online (Sandbox Code Playgroud)
R中的惯用解决方案是什么?
非常简单的问题,我想以一般的方式问,因为它似乎是一个经常出现的问题,我很乐意找到一种通用的方法来做到这一点.例如,问题是将逻辑矩阵转换为因子矩阵,但保持矩阵结构:行数和列数,列号,rownames.我想要更直接的东西
X2 <- matrix(as.mode(X), ncol=ncol(X));
rownames(X2) <- rownames(X) ...
Run Code Online (Sandbox Code Playgroud)
我已经在某些情况下找到了这个问题,所以我把它放在这里,但仍有一些问题......
A. into( - >)因素是我没有一个简单的方法.
B. 1.逻辑 - >数字:使用'+0'技巧
BoolMatrix <- matrix(c(TRUE,FALSE),nrow=3,ncol=2)
rownames(BoolMatrix) <- LETTERS[1:3]; colnames(BoolMatrix) <-LETTERS[11:12]
(NumMatrix <- BoolMatrix + 0)
Run Code Online (Sandbox Code Playgroud)
B. 2.数字 - >逻辑:直接使用条件
NumMatrix <- matrix(1:6, ncol=2)
rownames(NumMatrix) <- LETTERS[1:3]; colnames(NumMatrix) <-LETTERS[11:12]
(BoolMatrix <- NumMatrix == 0)
Run Code Online (Sandbox Code Playgroud)
C.数字< - >字符:不能比2个衬垫更好,直接改变模式工作(也可以在逻辑和数字之间工作,但上面的解决方案更优雅)
CharMatrix <- NumMatrix
mode(CharMatrix) <-"character"
print(CharMatrix)
Run Code Online (Sandbox Code Playgroud)
最后的解决方案("2班轮")实际上适用于与因素无关的任何事情,我遇到了困难......
任何的想法 ?:-)
根据文档read.csv
,参数stringsAsFactors
在设置时应将引用的数据值解释为因子.考虑以下数据文件,我们将调用它test.csv
.
"a",b,c
"1",2,3
"3",2,3
Run Code Online (Sandbox Code Playgroud)
当我尝试使用时读取此数据时read.csv
,它似乎不会将第一列解析为因子.
foo = read.csv("test.csv", stringsAsFactor=T)
is.factor(foo$a)
Run Code Online (Sandbox Code Playgroud)
输出:
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
我试图使用没有引号的列名,但这也不起作用.我怎么能纠正这个?
我可以使用像这样的索引重新排序因子的级别
factor(iris$Species,levels(iris$Species)[c(3:1)])
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试按名称重新排序相同的因子,它不起作用:
factor(iris$Species,levels(iris$Species)[c("virginica", "versicolor", "setosa")])
Run Code Online (Sandbox Code Playgroud)
有没有办法使用他们的名字重新排序因子的级别?
我想知道为什么as.factor
函数在通过apply
函数应用时不起作用R
?
> df.nrow <- 10
> df <- data.frame(col1=sample(c("a","b","c"), df.nrow, TRUE),
+ col2=sample(c("d","e","f"), df.nrow, TRUE),
+ col3=sample(c("g","h","i"), df.nrow, TRUE))
> apply(df, 2, is.factor)
col1 col2 col3
FALSE FALSE FALSE
> df <- apply(df, 2, as.factor)
> apply(df, 2, is.factor)
col1 col2 col3
FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud) 是否有可能比较R中相同长度不同水平的两个因素?
A <- factor(1:5)
str(A)
Factor w/ 5 levels "1","2","3","4",..: 1 2 3 4 5
B <- factor(c(1:3,6,6))
str(B)
Factor w/ 4 levels "1","2","3","6": 1 2 3 4 4
Run Code Online (Sandbox Code Playgroud)
运行这行代码
mean(A == B)
Run Code Online (Sandbox Code Playgroud)
给我以下错误:
Ops.factor(A,B)中的错误:因素的级别集是不同的
我有这个字符向量,但我需要将其转换为数字。
>iono_test_y
[1] "g" "b" "b" "g" "g" "g" "b" "g" "b" "b" "g" "b" "g" "b" "b" "b" "g" "g" "b" "b" "b" "g" "g"
[24] "b" "b" "g" "g" "g" "b" "g" "g" "g" "b" "b" "b" "b" "b" "g" "g" "g" "g" "g" "b" "g" "b" "b"
[47] "g" "g" "g" "g" "g" "g" "g" "g" "g" "g" "g" "g" "g" "g" "g" "g" "g" "g" "g" "g" "g" "g" "g"
[70] "g" "g"
Run Code Online (Sandbox Code Playgroud)
我已经试过了
iono_test_y <- …
Run Code Online (Sandbox Code Playgroud) 我有以下设置.
df <- data.frame(aa = rnorm(1000), bb = rnorm(1000))
apply(df, 2, typeof)
# aa bb
#"double" "double"
apply(df, 2, class)
# aa bb
#"numeric" "numeric"
Run Code Online (Sandbox Code Playgroud)
然后我尝试将其中一列转换为"factor".但是正如你在下面看到的,我没有得到任何"因素"类型或类.我做错了吗?
df[, 1] <- as.factor(df[, 1])
apply(df, 2, typeof)
# aa bb
#"character" "character"
apply(df, 2, class)
# aa bb
#"character" "character"
Run Code Online (Sandbox Code Playgroud)