如何在R中隐藏具有特定数据的行?

时间:2017-12-10 14:24:02

标签: r

我有一个包含多行的数据框。我想选择一些具有特定rownames(仅1和0)的行,并避免使用值为N和X的行(如图中突出显示)。该数据框如下:

Picture

结果如下:

        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)而不包含图中包含NX的行。我不想删除NX的行,只是不希望它们在绘图时显示。

1 个答案:

答案 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()

enter image description here

不幸的是,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