有条件地填充数据框的行

5

我有一个数据框架,希望填充以下结构:

    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个回答

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)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接