我有一个这个结构的数据框,我想填充:
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是一个字符串的行将保持为零。
答案 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