Reputation: 3195
data=structure(list(ID_WORKES = c(119642709L, 119642709L, 119642709L,
119642709L, 119642709L, 119642709L, 119642709L, 119642709L, 119642709L,
119642709L, 119642709L), TABL_NOM = c(56220L, 56220L, 56220L,
56220L, 56220L, 56220L, 56220L, 56220L, 56220L, 56220L, 56220L
), NAME = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L), .Label = "nov", class = "factor"), ID_SP_NAR = c(1048L,
1049L, 1050L, 1065L, 1066L, 1085L, 1086L, 1087L, 1088L, 1086L,
1087L), KOD_DOR = c(92L, 92L, 92L, 92L, 92L, 92L, 92L, 92L, 92L,
92L, 92L), KOD_DEPO = c(13283L, 13283L, 13283L, 13283L, 13283L,
13283L, 13283L, 13283L, 13283L, 13283L, 13283L), COLUMN_MASH = c(0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 3L, 0L, 4L), x1 = c(0, 0, 0, 0, 0,
0, 0, 0, 0.0625, 0, 0), x2 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
2L, 0L, 0L)), .Names = c("ID_WORKES", "TABL_NOM", "NAME", "ID_SP_NAR",
"KOD_DOR", "KOD_DEPO", "COLUMN_MASH", "x1", "x2"), class = "data.frame", row.names = c(NA,
-11L))
i need work only with column COLUMN_MASH.As we can see here only two values are integer (3 and 4) another values are zero. How for each id_worker
fill column_mash by last value in column_mash, i.e. here must be 4 in all rows.
ID_WORKES TABL_NOM NAME ID_SP_NAR KOD_DOR KOD_DEPO COLUMN_MASH x1 x2
1 119642709 56220 nov 1048 92 13283 4 0.0000 0
2 119642709 56220 nov 1049 92 13283 4 0.0000 0
3 119642709 56220 nov 1050 92 13283 4 0.0000 0
4 119642709 56220 nov 1065 92 13283 4 0.0000 0
5 119642709 56220 nov 1066 92 13283 4 0.0000 0
6 119642709 56220 nov 1085 92 13283 4 0.0000 0
7 119642709 56220 nov 1086 92 13283 4 0.0000 0
8 119642709 56220 nov 1087 92 13283 4 0.0000 0
9 119642709 56220 nov 1088 92 13283 4 0.0625 2
10 119642709 56220 nov 1086 92 13283 4 0.0000 0
11 119642709 56220 nov 1087 92 13283 4 0.0000 0
if the last value is 0, then fill the column with previous integer value.
Upvotes: 0
Views: 363
Reputation: 33498
Since this question is tagged with data.table:
library(data.table)
setDT(data)
data[, COLUMN_MASH := last(COLUMN_MASH[COLUMN_MASH != 0]), by = ID_WORKES]
# ID_WORKES TABL_NOM NAME ID_SP_NAR KOD_DOR KOD_DEPO COLUMN_MASH x1 x2
# 1: 119642709 56220 nov 1048 92 13283 4 0.0000 0
# 2: 119642709 56220 nov 1049 92 13283 4 0.0000 0
# 3: 119642709 56220 nov 1050 92 13283 4 0.0000 0
# 4: 119642709 56220 nov 1065 92 13283 4 0.0000 0
# 5: 119642709 56220 nov 1066 92 13283 4 0.0000 0
# 6: 119642709 56220 nov 1085 92 13283 4 0.0000 0
# 7: 119642709 56220 nov 1086 92 13283 4 0.0000 0
# 8: 119642709 56220 nov 1087 92 13283 4 0.0000 0
# 9: 119642709 56220 nov 1088 92 13283 4 0.0625 2
# 10: 119642709 56220 nov 1086 92 13283 4 0.0000 0
# 11: 119642709 56220 nov 1087 92 13283 4 0.0000 0
Upvotes: 2
Reputation: 51582
We can use ave
along with tail
, i.e.
with(data, ave(COLUMN_MASH, ID_WORKES, FUN = function(i) tail(i[i != 0], 1)))
#[1] 4 4 4 4 4 4 4 4 4 4 4
Assign it back to your data frame to update COLUMN_MASH
,
data$COLUMN_MASH<- with(data, ave(COLUMN_MASH, ID_WORKES, FUN = function(i) tail(i, 1)))
data
# ID_WORKES TABL_NOM NAME ID_SP_NAR KOD_DOR KOD_DEPO COLUMN_MASH x1 x2
#1 119642709 56220 nov 1048 92 13283 4 0.0000 0
#2 119642709 56220 nov 1049 92 13283 4 0.0000 0
#3 119642709 56220 nov 1050 92 13283 4 0.0000 0
#4 119642709 56220 nov 1065 92 13283 4 0.0000 0
#5 119642709 56220 nov 1066 92 13283 4 0.0000 0
#6 119642709 56220 nov 1085 92 13283 4 0.0000 0
#7 119642709 56220 nov 1086 92 13283 4 0.0000 0
#8 119642709 56220 nov 1087 92 13283 4 0.0000 0
#9 119642709 56220 nov 1088 92 13283 4 0.0625 2
#10 119642709 56220 nov 1086 92 13283 4 0.0000 0
#11 119642709 56220 nov 1087 92 13283 4 0.0000 0
Upvotes: 1
Reputation: 388817
In dplyr
, we can group_by
ID_WORKES
and get last
non-zero value for each ID_WORKES
.
library(dplyr)
data %>%
group_by(ID_WORKES) %>%
mutate(COLUMN_MASH = last(COLUMN_MASH[COLUMN_MASH != 0]))
# ID_WORKES TABL_NOM NAME ID_SP_NAR KOD_DOR KOD_DEPO COLUMN_MASH x1 x2
# <int> <int> <fct> <int> <int> <int> <int> <dbl> <int>
# 1 119642709 56220 nov 1048 92 13283 4 0 0
# 2 119642709 56220 nov 1049 92 13283 4 0 0
# 3 119642709 56220 nov 1050 92 13283 4 0 0
# 4 119642709 56220 nov 1065 92 13283 4 0 0
# 5 119642709 56220 nov 1066 92 13283 4 0 0
# 6 119642709 56220 nov 1085 92 13283 4 0 0
# 7 119642709 56220 nov 1086 92 13283 4 0 0
# 8 119642709 56220 nov 1087 92 13283 4 0 0
# 9 119642709 56220 nov 1088 92 13283 4 0.0625 2
#10 119642709 56220 nov 1086 92 13283 4 0 0
#11 119642709 56220 nov 1087 92 13283 4 0 0
Upvotes: 1