我有一个像这样的数据框
1 1 1 K 1 K K
2 1 2 K 1 K K
3 8 3 K 1 K K
4 8 2 K 1 K K
1 1 1 K 1 K K
2 1 2 K 1 K K
我想删除所有具有相同值的列,即K,所以我的结果将是这样的
1 1 1 1
2 1 2 1
3 8 3 1
4 8 2 1
1 1 1 1
2 1 2 1
我尝试按列迭代,但我什么都没得到。有任何想法吗?提前谢谢
答案 0 :(得分:4)
要选择具有多个值的列,而不考虑类型:
uniquelength <- sapply(d,function(x) length(unique(x)))
d <- subset(d, select=uniquelength>1)
(哎呀,罗马的问题是对的 - 这可能会淘汰你的专栏5)
也许(编辑:感谢评论!)
isfac <- sapply(d,inherits,"factor")
d <- subset(d,select=!isfac | uniquelength>1)
或
d <- d[,!isfac | uniquelength>1]
答案 1 :(得分:3)
这是一个解决方案,可以删除任何已复制的列(包括,例如,复制的字符,数字或因子列对)。这就是我读OP的问题,即使这是一个误读,它似乎也是一个有趣的问题。
df <- read.table(text="
1 1 1 K 1 K K
2 1 2 K 1 K K
3 8 3 K 1 K K
4 8 2 K 1 K K
1 1 1 K 1 K K
2 1 2 K 1 K K")
# Need to run duplicated() in 'both directions', since it considers
# the first example to be **not** a duplicate.
repdCols <- as.logical(duplicated(as.list(df), fromLast=FALSE) +
duplicated(as.list(df), fromLast=TRUE))
# [1] FALSE FALSE FALSE TRUE FALSE TRUE TRUE
df[!repdCols]
# V1 V2 V3 V5
# 1 1 1 1 1
# 2 2 1 2 1
# 3 3 8 3 1
# 4 4 8 2 1
# 5 1 1 1 1
# 6 2 1 2 1
答案 2 :(得分:2)
Oneliner解决方案。
df2 <- df[sapply(df, function(x) !is.factor(x) | length(unique(x))>1 )]
答案 3 :(得分:1)
另一种方法是使用高阶函数Filter
。这是代码
to_keep <- function(x) any(is.numeric(x), length(unique(x)) > 1)
Filter(to_keep, d)