Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:按行替换两个特定值之间的NA值_R - Fatal编程技术网

R:按行替换两个特定值之间的NA值

R:按行替换两个特定值之间的NA值,r,R,我正试图为以后的序列分析做好数据准备;为此,我需要在值1和2之间插入值1。 因此,对于每一行,值1和2之间的所有NA都等于1。我在下面列出了一个示例表;在我的实际数据中,每一行都是唯一的个体,每一列都是一个时间段。1代表入学,2代表从课程中退学。我正在尝试将“入学”和“出院”之间的时间间隔设置为1,表示已报名参加该计划,然后将剩余的NA设置为0,表示未参加该计划。每行/个人可以有多个入学 我一直在尝试使用apply,通过它我可以更改值本身,但是我不能替换值1和2之间的NA。任何指导都将不胜感激

我正试图为以后的序列分析做好数据准备;为此,我需要在值1和2之间插入值1。 因此,对于每一行,值1和2之间的所有NA都等于1。我在下面列出了一个示例表;在我的实际数据中,每一行都是唯一的个体,每一列都是一个时间段。1代表入学,2代表从课程中退学。我正在尝试将“入学”和“出院”之间的时间间隔设置为1,表示已报名参加该计划,然后将剩余的NA设置为0,表示未参加该计划。每行/个人可以有多个入学

我一直在尝试使用apply,通过它我可以更改值本身,但是我不能替换值1和2之间的NA。任何指导都将不胜感激

mdat <- matrix(c(1,NA,NA,NA,2,NA,NA,1,NA,2,  NA,NA,1,2,NA,NA,NA,1,NA,2), nrow = 2, ncol=10, byrow=TRUE,
           dimnames = list(c("row1", "row2"), c("C.1", "C.2", "C.3", "C.4", "C.5", "C.6", "C.7", "C.8", "C.9", "C.10")))

mdat如果我正确理解了您的需要,您可以首先将
NA
替换为
0
,然后在byrow基础上搜索出现的2与1的比较,以
1
填补“空白”(然后转置结果以保持前一格式):


mdat[is.na(mdat)]如果我正确理解了您的需要,您可以首先将
na
替换为
0
,然后在byrow基础上搜索2与1的匹配情况,以
1
填补“空白”(然后转置结果以保持前一格式):


mdat[is.na(mdat)]编辑:完全不同的答案。我不完全清楚OP想要什么,但是这个代码,尽管速度很慢,将立即用
1
替换
1
之后的所有
NA
。我发帖只是为了让任何有空闲时间的人和一份
microbenchmark
都能看到
na.locf
有多好

foo <- c(1,NA,2,NA,1,2,1,NA,NA,NA,2,NA,NA)
foo
length(foo)
for(jj in 2:length(foo) ) {
if ( (!is.na(foo[jj-1]) && foo[jj-1]==1) & is.na(foo[jj])) foo[jj]=1
}
foo
#then replace remaining `NA` with zero if desired

编辑:完全不同的答案。我不完全清楚OP想要什么,但是这个代码,尽管速度很慢,将立即用
1
替换
1
之后的所有
NA
。我发帖只是为了让任何有空闲时间的人和一份
microbenchmark
都能看到
na.locf
有多好

foo <- c(1,NA,2,NA,1,2,1,NA,NA,NA,2,NA,NA)
foo
length(foo)
for(jj in 2:length(foo) ) {
if ( (!is.na(foo[jj-1]) && foo[jj-1]==1) & is.na(foo[jj])) foo[jj]=1
}
foo
#then replace remaining `NA` with zero if desired
foo1)我们可以通过使用zoo软件包中的
na.locf
填充NAs,然后将填充版本中对应于1的
mdat
元素替换为1,从而获得一个相对紧凑的解决方案:

library(zoo)

replace(mdat, t(na.locf(t(mdat))) == 1, 1)
给予:

     C.1 C.2 C.3 C.4 C.5 C.6 C.7 C.8 C.9 C.10
row1   1   1   1   1   2  NA  NA   1   1    2
row2  NA  NA   1   2  NA  NA  NA   1   1    2
2)交替使用
na.locf
并用na替换
mdat
中为na的任何传播2。我们使用dplyr管道(尽管如果需要,可以消除这种情况):

1)我们可以通过使用zoo软件包中的
na.locf
填充NAs,然后将填充版本中对应于1的
mdat
元素替换为1,从而获得相对紧凑的解决方案:

library(zoo)

replace(mdat, t(na.locf(t(mdat))) == 1, 1)
给予:

     C.1 C.2 C.3 C.4 C.5 C.6 C.7 C.8 C.9 C.10
row1   1   1   1   1   2  NA  NA   1   1    2
row2  NA  NA   1   2  NA  NA  NA   1   1    2
2)交替使用
na.locf
并用na替换
mdat
中为na的任何传播2。我们使用dplyr管道(尽管如果需要,可以消除这种情况):



您的真实数据集有多大?(即,性能是一个问题吗?)抱歉,在这个问题中,我们应该指出,现实生活中的数据集非常大,1700行/个人,大约4000列/时间周期。关于您所需的输出,它与Q“将剩余NA设置为0”中所说的不匹配。您还需要这个吗?您只有1和2,没有其他整数?例如,如果您的数据收集代码为当前入院的患者分配了“3”,为出院的患者分配了“4”,那么这将容易得多。虽然这里有很好的解决方案,但真正的解决方案是首先修复生成数据集的代码?(即,性能是一个问题吗?)抱歉,在这个问题中,我们应该指出,现实生活中的数据集非常大,1700行/个人,大约4000列/时间周期。关于您所需的输出,它与Q“将剩余NA设置为0”中所说的不匹配。您还需要这个吗?您只有1和2,没有其他整数?例如,如果您的数据收集代码为当前入院的患者分配了“3”,为出院的患者分配了“4”,那么这将容易得多。虽然这里有很好的解决方案来解决您的特定问题,但真正的解决方案是首先修复生成数据集的代码。有
zoo
函数可以为您完成所有这些。有
zoo
函数可以为您完成所有这些。嘿,卡尔,您提到需要使用
zoo
na.fill
。但是你没有提到使用它的方法。一定要添加所需的代码(我认为这很简单),否则它将是半个答案。问候。@BhargavRao我打算——但在工作中没有安装
R
,而且在测试之前我从不发布代码——所以发布一个工作示例需要一段时间。这根本不是问题。如果可能的话,检查一下。你越早编辑越好。只需按照G.Grothendieck的
zoo
回答。我是否闻到正在删除的气味:/嘿,卡尔,你提到你需要使用
zoo
na.fill
。但是你没有提到使用它的方法。一定要添加所需的代码(我认为这很简单),否则它将是半个答案。问候。@BhargavRao我打算——但在工作中没有安装
R
,而且在测试之前我从不发布代码——所以发布一个工作示例需要一段时间。这根本不是问题。如果可能的话,检查一下。你越早编辑越好。只需按照G.Grothendieck的
zoo
回答。我是否闻到正在删除的气味:/
library(dplyr)
library(zoo)

mdat %>% t %>% na.locf %>% t %>% replace(. == 2 & is.na(mdat), NA)