0
  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))

我只需要使用列 COLUMN_MASH。正如我们在这里看到的,只有两个值是整数(3 和 4),另一个值是零。如何id_worker通过 column_mash 中的最后一个值填充 column_mash,即所有行中必须为 4。

 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

如果最后一个值为 0,则用前一个整数值填充该列。

4

3 回答 3

3

由于这个问题用标记:

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
于 2019-09-13T08:25:00.500 回答
2

我们可以ave和 一起使用tail,即

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

将其分配回您的数据框以进行更新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
于 2019-09-13T07:55:31.467 回答
2

dplyr中,我们可以group_by ID_WORKES得到last每个 的非零值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
于 2019-09-13T07:56:52.693 回答