只要值在R中没有变化就复制

Eri*_*ric 3 replace r dataframe

我有一个包含多行的数据框,请参见示例.

df <- data.frame(rbind(c('1','CAR','Jan'),
                       c('2','3','4'),
                       c('5','6','7'),
                       c('8','CAR','Feb'),
                       c('9','10', '11'),
                       c('12','13','14')))
Run Code Online (Sandbox Code Playgroud)

我想复制CAR(Jan和Feb)之后的值并将其复制到新的X4列中,直到CAR再次出现.CAR之间的行数并非始终相同,列数相同.

数据应如下所示

data.frame(rbind(c('1','CAR','Jan','Jan' ),
                     c('2','3','4','Jan'),
                     c('5','6','7','Jan'),
                     c('8','CAR','Feb','Feb'),
                     c('9','10','11','Feb'),
                     c('11','12','12','Feb')))
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的选项(ifelse,if,for循环),但它们都没有提供正确的结果.

你有任何关于如何解决这个问题的提示吗?在此先感谢Eric

Dav*_*urg 7

这是另一个data.table解决方案

library(data.table)
setDT(df)[, X4 := X3[1L], by = cumsum(X2 == "CAR")]
df
#    X1  X2  X3  X4
# 1:  1 CAR Jan Jan
# 2:  2   3   4 Jan
# 3:  5   6   7 Jan
# 4:  8 CAR Feb Feb
# 5:  9  10  11 Feb
# 6: 12  13  14 Feb
Run Code Online (Sandbox Code Playgroud)

我们也可以使用类似的东西dplyr(但它也会添加一个indx列)

library(dplyr)
df %>% 
  group_by(indx = cumsum(X2 == "CAR")) %>%
  mutate(X4 = X3[1L])
Run Code Online (Sandbox Code Playgroud)


akr*_*run 6

你可以试试

library(data.table)
library(zoo)
setDT(df)[X2=='CAR', X4:= X3][, X4:= na.locf(X4)]
#   X1  X2  X3  X4
#1:  1 CAR Jan Jan
#2:  2   3   4 Jan
#3:  5   6   7 Jan
#4:  8 CAR Feb Feb
#5:  9  10  11 Feb
#6: 12  13  14 Feb
Run Code Online (Sandbox Code Playgroud)


Fra*_*ank 5

这是David的答案的一个丑陋的基础R版本:

df$X4 <- unlist(tapply(
  df$X3,
  cumsum(df$X2=="CAR"),
  function(x){y <- levels(x)[x[1]]; rep(y,length(x))}
))
Run Code Online (Sandbox Code Playgroud)

  • 显示没有`data.table`它有多糟糕也可以帮助:) (4认同)