Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.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 用上一个值的一小部分替换向量中零的运行_R - Fatal编程技术网

R 用上一个值的一小部分替换向量中零的运行

R 用上一个值的一小部分替换向量中零的运行,r,R,我有一个包含零值的向量: x<-c(6,0,0,4,2,0,2,2,0,0,5) 例如,前三个元素应替换为6/3,即2 因此,之后x应如下所示: x<-c(2,2,2,4,1,1,2,0.66,0.66,0.66,5) x每当我看到向量的运行时,就会想到rle函数。在这种情况下,我们计算0和非0的运行长度: (x.rle <- rle(x == 0)) # Run Length Encoding # lengths: int [1:7] 1 2 2 1 2 2 1 #

我有一个包含零值的向量:

x<-c(6,0,0,4,2,0,2,2,0,0,5)
例如,前三个元素应替换为6/3,即2

因此,之后x应如下所示:

x<-c(2,2,2,4,1,1,2,0.66,0.66,0.66,5)

x每当我看到向量的运行时,就会想到
rle
函数。在这种情况下,我们计算0和非0的运行长度:

(x.rle <- rle(x == 0))
# Run Length Encoding
#   lengths: int [1:7] 1 2 2 1 2 2 1
#   values : logi [1:7] FALSE TRUE FALSE TRUE FALSE TRUE ...

(x.rle每当我看到向量的运行时,就会想到
rle
函数。在这种情况下,我们计算0和非0的运行长度:

(x.rle <- rle(x == 0))
# Run Length Encoding
#   lengths: int [1:7] 1 2 2 1 2 2 1
#   values : logi [1:7] FALSE TRUE FALSE TRUE FALSE TRUE ...

(x.rle我更熟悉使用数据帧。下面是一个使用技术操纵数据帧以获得结果的解决方案

# Load packages
library(tidyverse)
library(data.table)

# Create example data frame
dt <- data_frame(x = c(6,0,0,4,2,0,2,2,0,0,5))

# Create row id
dt2 <- dt %>% rowid_to_column() 

# Process the data
dt3 <- dt2 %>%
  mutate(nonzero = ifelse(x == 0, 0, 1)) %>%
  mutate(Group1 = rleid(nonzero)) %>%
  mutate(Group2 = ifelse(Group1 %% 2 == 1, Group1 + 1, Group1)) %>%
  filter(!(nonzero == 1 & lead(nonzero) == 1)) %>%
  group_by(Group2) %>%
  mutate(x2 = first(x)/n()) %>%
  select(-x) %>%
  right_join(dt2, by = "rowid") %>%
  mutate(x3 = ifelse(!is.na(x2), x2, x))

# Assign the output back to x
x <- dt3$x3
x
[1] 2.0000000 2.0000000 2.0000000 4.0000000 1.0000000 1.0000000 2.0000000 0.6666667
[9] 0.6666667 0.6666667 5.0000000
#加载包
图书馆(tidyverse)
库(数据表)
#创建示例数据帧
dt%
突变(Group1=rleid(非零))%>%
变异(Group2=ifelse(Group1%%2==1,Group1+1,Group1))%>%
过滤器(!(非零==1和导程(非零==1))%>%
分组依据(分组2)%>%
突变(x2=第一个(x)/n())%>%
选择(-x)%>%
右键联接(dt2,by=“rowid”)%>%
突变(x3=ifelse(!is.na(x2),x2,x))
#将输出分配回x

x我更熟悉使用数据框。下面是一个解决方案,使用技术操纵数据框以获得结果

# Load packages
library(tidyverse)
library(data.table)

# Create example data frame
dt <- data_frame(x = c(6,0,0,4,2,0,2,2,0,0,5))

# Create row id
dt2 <- dt %>% rowid_to_column() 

# Process the data
dt3 <- dt2 %>%
  mutate(nonzero = ifelse(x == 0, 0, 1)) %>%
  mutate(Group1 = rleid(nonzero)) %>%
  mutate(Group2 = ifelse(Group1 %% 2 == 1, Group1 + 1, Group1)) %>%
  filter(!(nonzero == 1 & lead(nonzero) == 1)) %>%
  group_by(Group2) %>%
  mutate(x2 = first(x)/n()) %>%
  select(-x) %>%
  right_join(dt2, by = "rowid") %>%
  mutate(x3 = ifelse(!is.na(x2), x2, x))

# Assign the output back to x
x <- dt3$x3
x
[1] 2.0000000 2.0000000 2.0000000 4.0000000 1.0000000 1.0000000 2.0000000 0.6666667
[9] 0.6666667 0.6666667 5.0000000
#加载包
图书馆(tidyverse)
库(数据表)
#创建示例数据帧
dt%
突变(Group1=rleid(非零))%>%
变异(Group2=ifelse(Group1%%2==1,Group1+1,Group1))%>%
过滤器(!(非零==1和导程(非零==1))%>%
分组依据(分组2)%>%
突变(x2=第一个(x)/n())%>%
选择(-x)%>%
右键联接(dt2,by=“rowid”)%>%
突变(x3=ifelse(!is.na(x2),x2,x))
#将输出分配回x

x这是一个非常简单的单行程序,使用
ave
并使用
cumsum
进行分组:

ave(x, cumsum(x > 0))
 [1] 2.0000000 2.0000000 2.0000000 4.0000000 1.0000000 1.0000000 2.0000000 
 [8] 0.6666667 0.6666667 0.6666667 5.0000000

这是一个非常简单的单行程序,使用
ave
并使用
cumsum
进行分组:

ave(x, cumsum(x > 0))
 [1] 2.0000000 2.0000000 2.0000000 4.0000000 1.0000000 1.0000000 2.0000000 
 [8] 0.6666667 0.6666667 0.6666667 5.0000000

replace(x,x==0,1)
,您的问题需要更多信息。您尝试了什么吗?我编辑了这篇文章以使其更具信息性。我只想将前面的非零值平均分配给下一个零值。
replace(x,x==0,1)
,您的问题需要更多信息。您尝试了什么吗?我编辑了这篇文章,使其更具信息性。我只想在下一个零值之间平均分配前面的非零值。