我有一个包含多行的数据框。我想选择一些具有特定rownames(仅1和0)的行,并避免使用值为N和X的行(如图中突出显示)。该数据框如下:
结果如下:
VD ITEM INFORMANTE TONICIDADE
79 1 naturais S2 tonica
81 1 america S3 Pmedial
82 1 federal S3 tonica
83 0 para S3 Pfinal
之所以这样,是因为我想使用plot(TONICIDADE, VD)
而不包含图中包含N
和X
的行。我不想删除N
和X
的行,只是不希望它们在绘图时显示。
答案 0 :(得分:1)
您正在从电子表格的思维模式中接近这一点,其中数据操作总是会混淆您的原始数据集以及制作副本的昂贵和繁琐的地方。在R中,我们不隐藏数据框的部分内容,我们制作的副本只包含我们感兴趣的部分(或修改)。
我没有您的数据集,所以我会使用iris
:
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
有很多方法可以删除行。我更喜欢dplyr包中的filter()
。例如,要删除Sepal.Length >= 5
的案例,我可以输入:
> iris2 <- filter(iris, Sepal.Length < 5)
> head(iris2)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 4.6 3.4 1.4 0.3 setosa
5 4.4 2.9 1.4 0.2 setosa
6 4.9 3.1 1.5 0.1 setosa
(您告诉filter()
您要保留的内容,而不是您要删除的内容。)
也可以使用管道运算符%>%
将修改后的数据帧直接输入下一个函数。如果您只想过滤一次并立即使用结果,则可以执行此操作。所以,如果我想过滤然后绘图,我可以这样做:
filter(iris, Sepal.Length < 5) %>%
ggplot(aes(x = Sepal.Width, y = Sepal.Length)) + geom_point()
不幸的是,base-R plot()
函数不会将数据框作为输入,因此管道方法要求您使用ggplot()
绘图。
针对您的具体问题:要过滤掉特定的值列表,您通常可以使用!variable %in% c(...)
模式,其中variable
是您要过滤的变量,c(...)
是你想要排除的东西的矢量,例如:
filter(data, !VD %in% c('N', 'X'))
如果没有!
,则使用相同的模式列出要包含的值而不是排除。
示例:
> data <- data.frame(VD = c("1", "0", "X", "N", "1"), values = rnorm(5))
> data
VD values
1 1 -0.56295856
2 0 0.36063581
3 X 0.06490702
4 N -0.23342063
5 1 -0.18901558
> filter(data, !VD %in% c('N', 'X'))
VD values
1 1 -0.5629586
2 0 0.3606358
3 1 -0.1890156
> filter(data, VD %in% c('0', '1'))
VD values
1 1 -0.5629586
2 0 0.3606358
3 1 -0.1890156