2015-02-26 3 views
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 является строкой, должны оставаться нулями.

ответ

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

Это идеальное решение, любите свою работу. Благодаря! – efbbrown

4

Мы могли бы создать индекс, основанный на присутствии чисел в столбце «V1» из «df1», использовать этот индекс для подмножества " df1 ", умножьте это на" df2 "после добавления" 1 "(при условии, что размеры будут одинаковыми)

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 
Смежные вопросы