我试图隔离所有观察值具有相同值的数据帧的那些列(忽略NA)。请参阅下面的假设示例:
ForestName <- rep("Planige", 4)
TreeNumber <- c(1:4)
Height <- c(2.3, 2, 2.1, 2.9)
Type <- c("AA", "AA", NA, "AA")
df <- data.frame(ForestName, TreeNumber, Height, Type)
df
新数据框应包含ForestName和Type。值不相等的列(TreeNumber和Height)应包含在另一个数据帧中。
答案 0 :(得分:2)
您可以使用unique
并检查这是否会缩减为单个元素:
df[sapply(df,function(x) length(unique(x[!is.na(x)])))==1]
ForestName Type
1 Planige AA
2 Planige AA
3 Planige <NA>
4 Planige AA
或测试all
元素是否等于第一个非NA
:
df[sapply(df, function(x) all(x==na.omit(x)[1],na.rm=T))]
ForestName Type
1 Planige AA
2 Planige AA
3 Planige <NA>
4 Planige AA
答案 1 :(得分:1)
在许多其他方面,我敢肯定:
df[,sapply(df,function(x) {length(unique(x[!is.na(x)])) > 1})]
TreeNumber Height
1 1 2.3
2 2 2.0
3 3 2.1
4 4 2.9
您可以否定sapply
表达式以获取其他列。
答案 2 :(得分:0)
使用相同基本原理的稍微紧凑的方法
Filter(function(x){length(unique(x[!is.na(x)])) <=1}, df)