R 有条件地填充数据帧的行

R 有条件地填充数据帧的行,r,dataframe,R,Dataframe,我有一个这种结构的数据框,我想填充: V1 V2 V3 V4 V5 V6 V7 V8 1 ID_CODE 0 0 0 0 0 0 0 2 THIS 0 0 0 0 0 0 0 3 ISAROW 0 0 0 0 0 0 0 4 01 0 0 0 0 0 0 0 5 02 0 0 0 0 0 0 0 6

我有一个这种结构的数据框,我想填充:

    V1      V2  V3  V4  V5  V6  V7  V8
1   ID_CODE 0   0   0   0   0   0   0
2   THIS    0   0   0   0   0   0   0
3   ISAROW  0   0   0   0   0   0   0
4   01      0   0   0   0   0   0   0
5   02      0   0   0   0   0   0   0
6   03      0   0   0   0   0   0   0
7   ID_CODE 0   0   0   0   0   0   0
8   THESE   0   0   0   0   0   0   0
9   ARE     0   0   0   0   0   0   0
10  MORE    0   0   0   0   0   0   0
11  ROWS    0   0   0   0   0   0   0
12  01      0   0   0   0   0   0   0
13  02      0   0   0   0   0   0   0
14  03      0   0   0   0   0   0   0
15  ROW     0   0   0   0   0   0   0
此数据框中包含用于填充的数字:

  V2_1 V2_2 V2_3 V2_4 V2_5 V2_6 V2_7
1 786  786  786  786  786  786  786
2 786  786  786  786  786  786  786
3 78   78   78   78   78   78   78
4 78   78   78   78   78   78   78
5 78   78   78   78   78   78   78
6 78   78   78   78   78   78   78

这些数字将进入V2:V8列,并且仅在V1为数字的行中。V1是字符串的行将保留为零。

如果
df1
是原始行,而
df2
是替换行,那么我们可以使用
Map
替换子集

## find the rows with only digits in the first column
rows <- grepl("^\\d+$", df1$V1)
## replace the subset with 'df2'
df1[rows, -1] <- Map("[<-", df1[rows, -1], df2)
df1
#         V1  V2  V3  V4  V5  V6  V7  V8
# 1  ID_CODE   0   0   0   0   0   0   0
# 2     THIS   0   0   0   0   0   0   0
# 3   ISAROW   0   0   0   0   0   0   0
# 4       01 786 786 786 786 786 786 786
# 5       02 786 786 786 786 786 786 786
# 6       03  78  78  78  78  78  78  78
# 7  ID_CODE   0   0   0   0   0   0   0
# 8    THESE   0   0   0   0   0   0   0
# 9      ARE   0   0   0   0   0   0   0
# 10    MORE   0   0   0   0   0   0   0
# 11    ROWS   0   0   0   0   0   0   0
# 12      01  78  78  78  78  78  78  78
# 13      02  78  78  78  78  78  78  78
# 14      03  78  78  78  78  78  78  78
# 15     ROW   0   0   0   0   0   0   0

我们可以根据“df1”的“V1”列中数字的存在创建一个索引,将该索引用于子集“df1”,在添加“1”后将其与“df2”相乘(假设维度相同)

indx
df1[rows, -1] <- Map(function(x, y) replace(x, rows, y), df1[-1], df2)
indx <- grep("^\\d+$", df1$V1)
df1[indx,-1] <- df1[indx,-1]+1 *df2
df1
#       V1  V2  V3  V4  V5  V6  V7  V8
#1  ID_CODE   0   0   0   0   0   0   0
#2     THIS   0   0   0   0   0   0   0
#3   ISAROW   0   0   0   0   0   0   0
#4       01 786 786 786 786 786 786 786
#5       02 786 786 786 786 786 786 786
#6       03  78  78  78  78  78  78  78
#7  ID_CODE   0   0   0   0   0   0   0
#8    THESE   0   0   0   0   0   0   0
#9      ARE   0   0   0   0   0   0   0
#10    MORE   0   0   0   0   0   0   0
#11    ROWS   0   0   0   0   0   0   0
#12      01  78  78  78  78  78  78  78
#13      02  78  78  78  78  78  78  78
#14      03  78  78  78  78  78  78  78
#15     ROW   0   0   0   0   0   0   0