以这种方式识别子集有什么不对:bull [c(1:10)& bull $ YearsPro> = 10,]?

时间:2017-12-26 05:47:56

标签: r

我想识别一个名为“bull”的数据框的子集。 子集应该包含任何一个数据框的前10行之一,并且“YearsPro”变量的值不小于10.所以我写道:

bull[c(1:10) & bull$YearsPro >= 10,]

但是上述代码没有给出预期的输出。它还会返回一条警告消息,指出“较长的对象长度不是较短对象长度的倍数”。

我想知道我的代码出了什么问题。谢谢!

以下是可重现的例子:

bull <- structure(list(Rider = c("Joao Ricardo Vieira", "Matt Triplett", 
                     "J.B. Mauney", "Kaique Pacheco", "Nathan Schaper", "Valdiron de Oliveira", 
                     "Guilherme Marchi", "Silvano Alves", "Reese Cates", "J.W. Harris", 
                     "Stetson Lawrence", "Mike Lee", "Fabiano Vieira", "Cody Nance", 
                     "Ben Jones"), Country = c("BRA", "USA", "USA", "BRA", "USA", 
                                               "BRA", "BRA", "BRA", "USA", "USA", "USA", "USA", "BRA", "USA", 
                                               "AUS"), YearsPro = c(3L, 4L, 10L, 2L, 6L, 9L, 16L, 7L, 9L, 10L, 
                                                                    8L, 14L, 9L, 9L, 17L)), .Names = c("Rider", "Country", "YearsPro"
                                                                    ), row.names = c(NA, 15L), class = "data.frame")

2 个答案:

答案 0 :(得分:1)

据我所知&amp; operator用于布尔语句。你的第一个陈述&#39; c(1:10)&#39;是一个索引语句。您可以尝试这样的事情:

new_bull <- bull[c(1:10),]
new_bull[new_bull$YearsPro > 10,]

OR

subset(bull[1:10,], YearsPro > 10)

答案 1 :(得分:0)

老实说,您的问题并不是那么清楚,因为您没有使用数据集的摘录返回可重现的代码。 无论如何,我建议你使用tidyverse函数的两种方法。这取决于你的目标:

library(tidyverse)


set.seed(1234)
bull <- data.frame(
    id=c(1:20),
    YearsPro=sample(1:30,20,replace=TRUE)
)

# Top 10 rows with YearsPro>10
new_bull <- bull %>%
    top_n(n=10) %>% 
    filter(YearsPro>10)

# Into top 10 rows select records with YearsPro>10
new_bull1 <- bull %>%
    slice(1:10) %>% 
    filter(YearsPro>10)