有条件地填充数据帧的行

时间:2015-02-26 03:09:44

标签: 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   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是一个字符串的行将保持为零。

2 个答案:

答案 0 :(得分:4)

如果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

或者,另一种方法是使用replace()

df1[rows, -1] <- Map(function(x, y) replace(x, rows, y), df1[-1], df2)

答案 1 :(得分:4)

我们可以根据“df1”的“V1”列中是否存在数字来创建索引,将该索引用于子集“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