【问题标题】:Selecting specific rows based on values in 2 columns in R根据R中2列中的值选择特定行
【发布时间】:2012-01-19 20:26:58
【问题描述】:

我有大量 GPS 项圈位置数据集,每天都有不同数量的位置。我只想分离出收集了单个位置的日期,并制作一个包含所有信息的新数据框。

month    day    easting    northing    time    ID
  6       1     #######    ########    0:00    ##
  6       2     #######    ########    6:00    ##
  6       2     #######    ########    0:00    ##
  6       3     #######    ########    18:00   ##
  6       3     #######    ########    12:00   ##
  6       4     #######    ########    0:00    ##
  6       5     #######    ########    6:00    ##

目前我已经对一些东西进行了哈希处理,但还不能完全进入下一步。

library(plyr)
dog<-count(data1,vars=c("MONTH","day"))
datasub1<-subset(dog,freq==1)

这给了我一个看起来像的读数

    MONTH day freq
1       6  29    1
7       7   5    1
8       7   6    1
10      7   8    1
12      7  10    1

我正在尝试使用月份和日期的值从主数据集中提取包含它们的行,以便我可以制作一个数据框,其中仅包含频率为 1 的点,但包含所有相关的数据。我已经到了这一点:

sis<-c(datasub1$MONTH)
bro<-c(datasub1$day)
datasub2<-subset(data1,MONTH==sis&day==bro)

...但这并没有给我任何东西,就个人而言,直觉上(R初学者)应该将包含bro和sis值的行子集化。

任何帮助将不胜感激。

【问题讨论】:

    标签: database r count plyr


    【解决方案1】:

    修订:

    datasub2<-subset(data1, paste(month,day,sep=".") %in% paste(datasub1$MONTH, datasub1$day,sep=".") )
    

    任何特定的 MONTH 项目都不太可能(也很可能不可能)完全等于该子集。您可能对“Month.Day”的组合是否在 datasub1 中的“Month.Day”组合集中更感兴趣。如果标题如您所示,则您混淆了从 count() 函数返回的大小写。

    > dog
      month day freq
    1     6   1    1
    2     6   2    2
    3     6   3    2
    4     6   4    1
    5     6   5    1
    > datasub1
      month day freq
    1     6   1    1
    4     6   4    1
    5     6   5    1
    > datasub2
      month day easting northing time ID
    1     6   1 ####### ######## 0:00 ##
    6     6   4 ####### ######## 0:00 ##
    7     6   5 ####### ######## 6:00 ##
    

    【讨论】:

    • 我对 %n% 不熟悉,由于某种原因,当我在 google 中搜索它时,它只识别出一个常规的 n,即使带有引号。此代码将整个数据集返回给我。我正在做 bro 和 sis 代码,因为数据库是按年份分开的,所以如果特定日期的位置修复频率为 1,那么数据集中只有一次出现该月和日的组合。
    • 第一点,它是%in% 而不是%n%。见help(match)。第二点,你希望我们能读懂你的想法(到目前为止没有成功),以了解“sis”和“bro”中的内容。显然没有人凭直觉知道您的目标是什么。
    • 抱歉,我会在帮助部分查看。
    • 在原始帖子中,在 dog
    • 因此,例如,我在第 6 个月的第 6 天,位置修复的频率为 1。在接下来的 3 天里,有不同数量的位置修复,所以我不想碰它们,并且在 10 日再次出现单一频率。姐姐是 6,6,兄弟是 6,10。所以我希望能够对数据进行子集化,说当 sis 为 6 且 bro 为 6 时,删除该行,然后当 sis 为 6 且 bro 为 10 时,删除该行。等等。我希望这是有道理的。感谢您的帮助。
    【解决方案2】:

    之后:

    library(plyr)
    dog<-count(data1,vars=c("MONTH","day"))
    

    试试这个:

    indx = which(dog$freq==1)
    data1[indx,]
    

    【讨论】:

    • 不幸的是,当我使用计数代码时,它会折叠数据集,那些具有多个位置点的日子被放置在一行中。因此数据集从 509 行变为 149 行,当我执行上述代码时,它为我提供了与 149 行对应的行的数据。如果这是有道理的。因此,当不是选择具有单个位置点但位于第 25 行的第 7 天时,它会选择第 7 行(每一天都折叠成一行)。这有意义吗?
    【解决方案3】:
    data1[rownames(datasub1), ]
    

    这是 OP 最初想法的延伸,但可能不是他们所追求的,实际上正是 Wesley 建议的,但将 OP 的原始步骤向前推进了一步(减去 bro sis 部分,这让我有点困惑,因为。 ..出于同样的原因DWin说:))。您关注的是行名,而不是这些列中的值。你已经得到了这些信息。行名称将该信息带回原始数据集。

    n <- 100
    data1 <- data.frame(
        Accuracy = round(runif(n, 0, 5), 1),
        MONTH    = sample(1:5, n, replace=TRUE),
        day      = sample(1:28, n, replace=TRUE),
        Easting  = rnorm(n),
        Northing = rnorm(n),
        Etc      = rnorm(n)
    )
    
    
    library(plyr)
    dog<-count(data1,vars=c("MONTH","day"))
    datasub1<-subset(dog,freq==1)
    
    data1[rownames(datasub1), ]
    

    【讨论】:

    • 这段代码发生的事情与上面 Wesley 提供的代码相同。不幸的是,当我使用计数代码时,它会折叠数据集,那些具有超过 1 个位置点的日子被放置在一行中。因此数据集从 509 行变为 149 行,当我执行上述代码时,它为我提供了与 149 行对应的行的数据。如果这是有道理的。因此,当不是选择具有单个位置点但位于第 25 行的第 7 天时,它会选择第 7 行(每一天都折叠成一行)。这有意义吗?
    猜你喜欢
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    相关资源
    最近更新 更多