我有一个大的相框,我想应用过滤器.条件是,如果一个元素和它的前一个值之间的差大于40,我想把这个元素设置为NA.

微型数据样本:

mydataframe <- data.frame(matrix(runif(n=150, min=1, max=100), nrow=10)) 

我可以很容易地根据元素和它的前一个元素之间的差异创建一个矩阵,但是使用它来过滤原始数据帧被证明是很棘手的.这是我用来生成差分矩阵的计算方法:

calculatedifference <- function(a) {
  difference = a - lag(a)
  difference 
}
differencematrix <- sapply(mydataframe, calculatedifference)

我试了以下操作,但它返回了一个充满NA的双框:

differencefilter <- function(a){
  difference = a - lag(a)
  case_when(
    difference > 40 ~ NA
  )
}

可能是因为我给Case_When()提供了一个完整的向量,它将整个元素设置为NA,而不是将满足条件的任何元素设置为NA.不确定如何 for each 向量中的每个单独元素排序命令.我最初的计划是为单个向量构建一个函数,然后将其应用于原始数据帧,但如果有更有效的方法来实现这一目标,那也是很好的.同样,我希望原始mydataframe中的元素设置为NA,而不是DifferencemMatrix中的值.谢谢你的帮助!

推荐答案

你的方法很好,问题是当你的条件不满足时,你没有为case_when设置默认值,而case_when的默认值是NA.如果你把代码改为

case_when(
    difference > 40 ~ NA, .default = a
  )

我想这会起作用的.我会更直接一点,像这样:

set.seed(47)
mydataframe <- data.frame(matrix(runif(n=50, min=1, max=100), nrow=5)) 

library(dplyr)

mydataframe
#         X1       X2       X3        X4       X5        X6       X7       X8        X9      X10
# 1 97.71924 69.44983 14.74096 90.295379 18.63639 38.622468 75.13312 44.52890  6.806878 21.08084
# 2 38.01769 39.51712 70.49673 40.649777 56.12284  4.342001 37.52843 24.84979 37.672119 66.51133
# 3 76.38870 47.42565 17.05717  4.063552 52.06370  4.652532 47.30130 97.66172 60.239314 96.34999
# 4 82.42667 54.78766 60.33139  8.064458 14.20961 54.107717 20.16720 48.89779 93.813872 37.83152
# 5 57.78090 92.56431 51.09757 47.363336 69.23906 80.155587 89.79590 68.70130 37.310393 85.85034

mydataframe |>
  mutate(across(everything(), \(x) abs(ifelse(abs(x - lag(x, default = first(x))) > 40, NA, x))))
#         X1       X2       X3        X4       X5        X6       X7       X8        X9      X10
# 1 97.71924 69.44983 14.74096 90.295379 18.63639 38.622468 75.13312 44.52890  6.806878 21.08084
# 2       NA 39.51712       NA        NA 56.12284  4.342001 37.52843 24.84979 37.672119       NA
# 3 76.38870 47.42565       NA  4.063552 52.06370  4.652532 47.30130       NA 60.239314 96.34999
# 4 82.42667 54.78766       NA  8.064458 14.20961        NA 20.16720       NA 93.813872       NA
# 5 57.78090 92.56431 51.09757 47.363336       NA 80.155587       NA 68.70130        NA       NA


## or using case_when in case you have more conditions
mydataframe |>
  mutate(across(everything(), \(x)
    case_when(
      abs(x - lag(x)) > 40 ~ NA, 
      .default = x
    )
))
## same result as above

R相关问答推荐

删除facet_wrap标签之间的水平线

为什么当我try 在收件箱中使用合并功能时会出现回收错误?

有没有一种方法可以从函数中创建一个值的列表,然后将这些值变成R中的直方图?我一直觉得不行

在连续尺度上转置标签[瀑布图,R]

在rpart. plot或fancyRpartPlot中使用带有下标的希腊字母作为标签?

从一个列表的框架中移除列表包装器

根据现有列的名称和字符串的存在进行变异以创建多个新列

如何在ggplot2中绘制具有特定 colored颜色 的连续色轮

正在导出默认的RStudio主题,还是设置括号 colored颜色 ?

列名具有特殊字符时的循环回归

我们如何在R中透视数据并在之后添加计算

如何使用前缀作为匹配来连接数据帧?

'使用`purrr::pwalk`从嵌套的嵌套框架中的列表列保存ggplots时出现未使用的参数错误

如何在使用因子时获得Sankey图的Scale_Fill_Viridis的全范围

访问数据帧中未定义的列时出现R错误

如何将宽格式的患者信息数据高效地转换为患者计数的时间序列?

在使用SliderInput In Shiny(R)设置输入数据的子集时,保留一些情节痕迹

R-如何在ggplot2中显示具有不同x轴值(日期)的多行?

将日期列从字符转换为日期得到的结果是NAS

使用显式二元谓词子集化sfc对象时出错