2015-02-26 17 views
5

mam ramki danych o tej konstrukcji, która I jak do wypełnienia:warunkowo napełniania rzędy ramki danych

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 

I ramka danych z numerami w celu jej wypełnienia:

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 

Liczby te mają przejść do kolumn V2: V8 i tylko w wierszach, w których V1 jest liczbą. Wiersze, w których V1 jest ciągiem, mają pozostać zerami.

Odpowiedz

4

Jeśli df1 jest oryginałem i df2 zamiennikiem, możemy użyć Map, aby zastąpić podzestaw.

## 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 

Lub inny sposób byłoby użyć replace()

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

To idealne, uwielbiam swoją pracę. Dzięki! – efbbrown

4

Moglibyśmy utworzyć indeks na podstawie obecności liczb w „V1” kolumnie „DF1”, użyj tego indeksu do podzbioru " df1 ", pomnóż to przez" df2 "po dodaniu" 1 "(przy założeniu, że wymiary będą takie same)

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 
Powiązane problemy