【问题标题】:Using ifelse to remove unwanted rows from the dataset in R使用 ifelse 从 R 中的数据集中删除不需要的行
【发布时间】:2012-09-17 12:28:33
【问题描述】:

我有一个数据集,我想在其中删除我的几个人在第一个观察年中第 11 个月的出现次数。是否可以用 ifelse 做到这一点?类似的东西:

ifelse(ID=="1" & Month=="11" and Year=="2006", "remove these rows",  
  ifelse(ID=="2" & Month=="11" & Year=="2007", "remove these rows",   
         "nothing"))  

一如既往,感谢所有帮助! :)

【问题讨论】:

  • 这个问题可能有很多很好的答案,所有这些都将从一个可重复的例子中受益匪浅。
  • 您要删除多少个人? 2个或3个,还是更多? (如果更多,你应该使用%in%)。

标签: r subset if-statement


【解决方案1】:

如果您想要的只是要删除或不删除哪个指示器,您甚至不需要 ifelse()

ind <- (Month == "11") &
           ((ID == "1" & Year == "2006") | (ID == "2" & Year == "2007"))

如果Month"11" 并且如果其他两个子条款中的任何一个是TRUEind 将包含 TRUE。

然后您可以通过[subset() 在任何子集操作中使用!ind 删除这些样本。

dat <- data.frame(ID = rep(c("1","2"), each = 72),
                  Year = rep(c("2006","2007","2008"), each = 24),
                  Month = rep(as.character(1:12), times = 3))
ind <- with(dat, (Month == "11") & ((ID == "1" & Year == "2006") |
                                    (ID == "2" & Year == "2007")))
ind
dat2 <- dat[!ind, ]

这给了

R> ind
  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
 [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
 [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [97] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
[109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
[121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
R>     dat2 <- dat[!ind, ]
R> nrow(dat)
[1] 144
R> nrow(dat2)
[1] 140

就示例数据而言这是正确的/

【讨论】:

    【解决方案2】:

    data.table 解决方案,节省时间和内存(少编码)。它适用于数据集。

    如果列是整数,则不是因子

    library(data.table)
    DT <- data.table(ID = rep(1:2, each = 72),
              Year = rep(2006:2008, each = 24),
              Month = rep(1:12, times = 3))
    # or you could use:   DT <- as.data.table(dat)
    setkey(DT,ID,Year,Month)
    DT[-DT[J(1:2,2006:2007,11),which=TRUE]]
    

    【讨论】:

    • 感谢您的提醒——在字符/因素和-J(...)
    • 啊,我没有注意到字符/因素方面。如果DT 的列是类型字符,则:DT[-DT[J(c("1","2"),as.character(2006:2007),"11"),which=TRUE]]。如果它们是因素,那么它也会起作用(我认为有警告)或作为因素:DT[-DT[J(factor(1:2),factor(2006:2007),factor(11)),which=TRUE]]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2013-04-26
    • 1970-01-01
    相关资源
    最近更新 更多