2012-09-21 162 views
0

我正在尝试隔离所有观察值具有相同值(忽略NAs)的数据帧的那些列。请参阅下面的假设示例:分离具有相同值的列

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)应该包含在另一个数据框中。

回答

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表达,以获得其他列。

+0

This作品!谢谢! –

+0

@RobertWest请将正确的解决方案标记为已接受的答案。 – Superbest

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 
+0

这工作也很好。谢谢! –

0

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

Filter(function(x){length(unique(x[!is.na(x)])) <=1}, df)