psysky
psysky

Reputation: 3195

how fill column by last value

  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

Answers (3)

s_baldur
s_baldur

Reputation: 33498

Since this question is tagged with :

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

Sotos
Sotos

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

Ronak Shah
Ronak Shah

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

Related Questions