0

我正在尝试隔离所有观察值都具有相同值的数据框的那些列(忽略 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)的列应包含在另一个数据框中。

4

3 回答 3

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
于 2012-09-21T13:50:13.810 回答
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表达式以获取其他列。

于 2012-09-21T13:49:36.683 回答
0

使用相同基本原理的稍微更紧凑的方法

 Filter(function(x){length(unique(x[!is.na(x)])) <=1}, df)
于 2012-09-25T06:43:21.680 回答