观察值小于特定值-R 的水平下降因子
Dropping factors which levels have observations smaller than a specific value-R
让我有这样的数据框(df1),其中包含以下因素:
factor1 factor2 factor3
------- ------- -------
d a x
d a x
b a x
b c x
b c y
c c y
c n y
c n y
c n y
我想从此数据框中删除其中一个元素的观察值少于 3 个的因素。
在此数据框中,factor1 有 3 个级别(d、b 和 c)。但是 d 级别的频率为 2。所以我想从此数据框中删除 factor1。
结果数据框应为:
factor2 factor3
------- -------
a x
a x
a x
c x
c y
c y
n y
n y
n y
我如何使用 R 执行此操作?我会很高兴任何帮助。非常感谢。
这是你想要的吗?
df <- data.frame(col1=rep(letters[1:4], each=3),
col2=rep(letters[1:2], each=6),
col3=rep(letters[1:3], each=4))
ddf[, sapply(df, function(x) min(nlevels(x)) > 2)]
您可以尝试使用 lapply
和 table
:
df1[, lapply(c(1,2,3), FUN = function(x) min(table(df1[,x]))) >= 3]
而且,更通用一点:
df1[, lapply(1:ncol(df1), FUN = function(x) min(table(df1[,x]))) >= 3]
我会创建一个快速帮助函数,通过快速调用 table()
检查每个级别存在多少个唯一实例——查看 table(df$fac1)
以了解其工作原理。请注意,这不是很可靠,但应该可以帮助您入门:
df <- data.frame(fac1 = factor(c("d", "d", "b", "b", "b", "c", "c", "c", "c")),
fac2 = factor(c("a", "a", "a", "c", "c", "c", "n", "n", "n")),
fac3 = factor(c(rep("x", 4), rep("y", 5))),
other = 1:9)
at_least_three_instances <- function(column) {
if (is.factor(column)) {
if (min(table(column)) > 2) {
return(TRUE)
} else {
return(FALSE)
}
} else {
return(TRUE)
}
}
df[unlist(lapply(df, at_least_three_instances))]
我们可以使用Filter
Filter(function(x) min(nlevels(x))>2, df1)
(基于其中一篇点赞帖子的结果)
或者也可以
Filter(function(x) min(tabulate(x))>2, df1)
让我有这样的数据框(df1),其中包含以下因素:
factor1 factor2 factor3
------- ------- -------
d a x
d a x
b a x
b c x
b c y
c c y
c n y
c n y
c n y
我想从此数据框中删除其中一个元素的观察值少于 3 个的因素。
在此数据框中,factor1 有 3 个级别(d、b 和 c)。但是 d 级别的频率为 2。所以我想从此数据框中删除 factor1。
结果数据框应为:
factor2 factor3
------- -------
a x
a x
a x
c x
c y
c y
n y
n y
n y
我如何使用 R 执行此操作?我会很高兴任何帮助。非常感谢。
这是你想要的吗?
df <- data.frame(col1=rep(letters[1:4], each=3),
col2=rep(letters[1:2], each=6),
col3=rep(letters[1:3], each=4))
ddf[, sapply(df, function(x) min(nlevels(x)) > 2)]
您可以尝试使用 lapply
和 table
:
df1[, lapply(c(1,2,3), FUN = function(x) min(table(df1[,x]))) >= 3]
而且,更通用一点:
df1[, lapply(1:ncol(df1), FUN = function(x) min(table(df1[,x]))) >= 3]
我会创建一个快速帮助函数,通过快速调用 table()
检查每个级别存在多少个唯一实例——查看 table(df$fac1)
以了解其工作原理。请注意,这不是很可靠,但应该可以帮助您入门:
df <- data.frame(fac1 = factor(c("d", "d", "b", "b", "b", "c", "c", "c", "c")),
fac2 = factor(c("a", "a", "a", "c", "c", "c", "n", "n", "n")),
fac3 = factor(c(rep("x", 4), rep("y", 5))),
other = 1:9)
at_least_three_instances <- function(column) {
if (is.factor(column)) {
if (min(table(column)) > 2) {
return(TRUE)
} else {
return(FALSE)
}
} else {
return(TRUE)
}
}
df[unlist(lapply(df, at_least_three_instances))]
我们可以使用Filter
Filter(function(x) min(nlevels(x))>2, df1)
(基于其中一篇点赞帖子的结果)
或者也可以
Filter(function(x) min(tabulate(x))>2, df1)