2013-11-26 92 views
4

我想要一個變量,其中包含數據幀的所有行df,其中x大於y。但由於某種原因,我不斷收到這個奇怪的錯誤。帶有邏輯測試的索引

> x <- c(5,6,7,8,9,10) 
> y <- c(1,7,8,29,0,1) 
> 
> df <- data.frame(x, y) 
> 
> x.is.more <- df[,"x" > "y"]; x.is.more 
data frame with 0 columns and 6 rows 

上面的代碼應該相同的結果x.is.more <- df[c(1,6),]但由於某種原因它不工作。

+0

試試這個'x.is.more <- df[df$x > DF $ Y,]' – zx8754

回答

2

您可以使用transform,如果你想在新的變量附加到現有的數據幀

> transform(df, x.is.more= x>y) 
    x y x.is.more 
1 5 1  TRUE 
2 6 7  FALSE 
3 7 8  FALSE 
4 8 29  FALSE 
5 9 0  TRUE 
6 10 1  TRUE 

使用with如果你只是想一個新的變量

> x.is.more <- with(df, x>y) 
> x.is.more 
[1] TRUE FALSE FALSE FALSE TRUE TRUE 

如果你想子集,則嘗試

> df[ with(df, x>y), ] # equivalent to df[ x.is.more, ] 
    x y 
1 5 1 
5 9 0 
6 10 1 

或直接使用在@詹姆斯回答

3

功能可能是這樣做的最直接的方式:

subset(df, x>y) 
    x y 
1 5 1 
5 9 0 
6 10 1 
0

啊哈!我想到了。

相反的,

x.is.more <- df[,"x" > "y"] 

我應該有,

x.is.more <- df[x > y,] 
+0

嘗試刪除x和y向量'rm(x,y)'並運行你的代碼,它將失敗。 – zx8754

+0

沒錯。那麼通過邏輯測試就沒有辦法進行索引? – Anton

+0

當然你可以看到我的答案。 – zx8754

1

試試這個:

#dummy dataframe 
df <- data.frame(x=c(5,6,7,8,9,10), 
       y=c(1,7,8,29,0,1)) 

#find x>y 
x.is.more <- df[df$x > df$y, ] 

#output 
x.is.more 
# x y 
#1 5 1 
#5 9 0 
#6 10 1