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
这是另一个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)
你可以试试
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)
这是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)
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |