【问题标题】:Remove observation based a given condition删除基于给定条件的观察
【发布时间】:2020-04-18 15:55:59
【问题描述】:

我想从数据集中删除特定的观察结果。每个观察都有一个序列号(标识号)、Day(从周一到周日的工作日)7 个变量 day1 到 day7,每个变量代表一周中的一天。第 1 天是星期一,第 7 天是星期日。

我想删除第 1 天...第 7 天等于零的那些观察结果(连续剧)。这是 id 12 的情况,在星期一期间没有进行任何观察(例如,与第 1 天匹配的日期返回零)。以 123 为例,周二有 3 个观察记录,我想保留这个序列。

我尝试将数据转换为 long 并基于此进行匹配但没有成功。

输入:

  serial  day1 day2 day3 day4 day5 day6 day7 Day 
    12    0    1    2    1    1    3    1   Monday   
   123    0    3    0    3    3    0    3   Tuesday  
    10    0    3    0    3    3    3    3   Thursday 

输出:

serial  day1 day2 day3 day4 day5 day6 day7 Day 
  123    0    3    0    3    3    0    3   Tuesday  

样本数据

structure(list(serial = c(12, 123, 10), day1 = c(0, 0, 0), day2 = c(1, 
3, 3), day3 = c(2, 0, 0), day4 = c(1, 3, 3), day5 = c(1, 3, 3
), day6 = c(3, 0, 3), day7 = c(1, 3, 3), Day = structure(c(1L, 
3L, 2L), .Label = c("Monday", "Thursday", "Tuesday"), class = "factor")), row.names = c(NA, 
3L), class = "data.frame")

【问题讨论】:

  • 能否补充一些已经失败的解决方案?
  • @NelsonGon 非常感谢我尝试改变数据并匹配 Days。,
  • 你说删除第 1 天或第 7 天等于 0 的观察结果。序列 123 的条件是第 1 天为 0,为什么它没有被删除
  • 创建第二个数据框,在其中添加匹配条件。

标签: r dataframe


【解决方案1】:

以下代码可以满足问题的要求。
它使用包DescTools 来获得一个包含工作日名称的向量,并将Day 列中的值与该向量匹配。然后将字符串"day" 与日期数字粘贴在一起,并使用这些字符串来获取观察结果并将行保留在不为零的位置。

j <- match(df1$Day, DescTools::day.name)
j <- paste0("day", j)
df1[diag(as.matrix(df1[, j])) != 0, ]
#  serial day1 day2 day3 day4 day5 day6 day7      Day
#2    123    0    3    0    3    3    0    3  Tuesday
#3     10    0    3    0    3    3    3    3 Thursday

【讨论】:

  • @user10974052 我应该说代码使用了非基础 R 包。将编辑。
猜你喜欢
  • 2021-08-26
  • 2022-08-31
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
相关资源
最近更新 更多