gpt4 book ai didi

r - 延长一定长度的运行

转载 作者:行者123 更新时间:2023-12-03 23:07:05 26 4
gpt4 key购买 nike

我有一个带有数值的 640 x 2500 数据框和几个 NA值。我的目标是找到至少 75 个连续的 NA每行中的值。对于每次这样的运行,我想用 NA 替换前面和后面的 50 个单元格。值也是。

这是一行的缩小示例:

x <- c(1, 3, 4, 5, 4, 3, NA, NA, NA, NA, 6, 9, 3, 2, 4, 3)
# run of four NA: ^ ^ ^ ^

我想检测连续四次运行 NA ,然后将运行前的三个值和运行后的三个值替换为 NA :
c(1, 3, 4, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 2, 4, 3) 
# ^ ^ ^ ^ ^ ^

我试图首先识别连续的 NA s 与 rle ,但正在运行 rle(is.na(df))给出错误 'x' must be a vector of an atomic type .即使我选择一行,也会发生这种情况。

不幸的是,我不知道接下来要采取什么步骤将前后 50 个单元格转换为 NA。

非常感谢对此的任何帮助,在此先感谢。

最佳答案

因为您在数据中评论说“某些 [行] 以几个 NA 开始和结束”,希望这能更好地代表真实数据:

  A  B  C  D  E  F  G  H  I  J
1 1 2 3 NA NA 6 7 8 NA 10
2 1 NA NA NA 5 6 7 NA NA NA
3 1 2 3 4 NA NA NA 8 9 10

假设最小运行长度为 NANA 扩展是 2,并且运行前的两个值和运行后的两个值应替换为 NA .在此示例中,第 2 行将代表您在评论中提到的案例。

首先是一些数据争吵。我更喜欢与 data.table 一起工作长格式。与 data.table我们可以访问有用的常量 .I.N ,并且可以使用 rleid 轻松创建运行 ID .
# convert data.frame to data.table
library(data.table)
setDT(d)

# set minimum length of runs to be expanded
len = 2L

# set number of values to replace on each side of run
n = 2L

# number of columns of original data (for truncation of indices)
nc = ncol(d)

# create a row index to keep track of the original rows in the long format
d[ , ri := 1:.N]

# melt from wide to long format
d2 = melt(d, id.vars = "ri")

# order by row index
setorder(d2, ri)

现在对运行及其索引的实际计算:
d2[
# check if the run is an "NA run" and has sufficient length
d2[ , if(anyNA(value) & .N >= len){

# get indices before and after run, where values should be changed to NA
ix = c(.I[1] - n:1L, .I[.N] + 1L:n)

# truncate indices to keep them within (original) rows
ix[ix >= 1 + (ri - 1) * nc & ix <= nc * ri]},

# perform the calculation by row index and run index
# grab replacement indices
by = .(ri, rleid(is.na(value)))]$V1,

# at replacement indices, set value to NA
value := NA]

如果需要,转换回宽格式
dcast(d2, ri ~ variable, value.vars = "value")
# ri A B C D E F G H I J
# 1: 1 1 NA NA NA NA NA NA 8 NA 10
# 2: 2 NA NA NA NA NA NA NA NA NA NA
# 3: 3 1 2 NA NA NA NA NA NA NA 10

关于r - 延长一定长度的运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61839069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com