как добавить префикс в выбранные строки в соответствии с последней строкой в ​​R - PullRequest
1 голос
/ 21 апреля 2020

У меня есть такой фрейм данных:

 Target Time ...
  pa     1   
  pa     2
  pa     3
  pa     4
  pa     5
  pa     6
  pa     7
  pa     8
  pa     9
  pa     10
  li     11
  li     12
  li     13
  li     14
  li     15
  li     16
  li     17
  li     18
  li     19
  li     20
  ka     1   
  ka     2
  ka     3
  ka     4
  ka     5
  ka     6
  ka     7
  ka     8
  ka     9
  ka     10
  li     11
  li     12
  li     13
  li     14
  li     15
  li     16
  li     17
  li     18
  li     19
  li     20
  pha     1   
  pha     2
  pha     3
  pha     4
  pha     5
  pha     6
  pha     7
  pha     8
  pha     9
  pha     10
  le     11
  le     12
  le     13
  le     14
  le     15
  le     16
  le     17
  le     18
  le     19
  le     20
..."

И я хочу добавить префикс перед целями от 11 до 20 на основе целей от 1 до 10. sh:

 Target Time ...
  pa     1   
  pa     2
  pa     3
  pa     4
  pa     5
  pa     6
  pa     7
  pa     8
  pa     9
  pa     10
  pa_li     11
  pa_li     12
  pa_li     13
  pa_li     14
  pa_li     15
  pa_li     16
  pa_li     17
  pa_li     18
  pa_li     19
  pa_li     20
  ka     1   
  ka     2
  ka     3
  ka     4
  ka     5
  ka     6
  ka     7
  ka     8
  ka     9
  ka     10
  ka_li     11
  ka_li     12
  ka_li     13
  ka_li     14
  ka_li     15
  ka_li     16
  ka_li     17
  ka_li     18
  ka_li     19
  ka_li     20
  pha     1   
  pha     2
  pha     3
  pha     4
  pha     5
  pha     6
  pha     7
  pha     8
  pha     9
  pha     10
  pha_le     11
  pha_le     12
  pha_le     13
  pha_le     14
  pha_le     15
  pha_le     16
  pha_le     17
  pha_le     18
  pha_le     19
  pha_le     20
...

Я подумал, что сначала мне нужно l oop просмотреть данные и использовать условие, поэтому я попытался:

for (i in 1:nrow(df)){
  ifelse (df$Time < 11,prev<-df$Target,df$Target<-paste(prev, df$Target,sep = "_"))
  print(df)
}

Но это не работает ... Мне интересно, правильный ли мой лог c или есть проблема с утверждением? .. Я новичок в R, очень надеюсь, что кто-нибудь может помочь! Большое спасибо !!

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

В будущем используйте dput() для вставки ваших данных. Он сохраняет детали, которые не выводятся на печать, например, если Target является фактором или символьным полем:

df <- structure(list(Target = c("pa", "pa", "pa", "pa", "pa", "pa", 
"pa", "pa", "pa", "pa", "pa_li", "pa_li", "pa_li", "pa_li", "pa_li", 
"pa_li", "pa_li", "pa_li", "pa_li", "pa_li", "ka", "ka", "ka", 
"ka", "ka", "ka", "ka", "ka", "ka", "ka", "ka_li", "ka_li", "ka_li", 
"ka_li", "ka_li", "ka_li", "ka_li", "ka_li", "ka_li", "ka_li", 
"pha", "pha", "pha", "pha", "pha", "pha", "pha", "pha", "pha", 
"pha", "pha_le", "pha_le", "pha_le", "pha_le", "pha_le", "pha_le", 
"pha_le", "pha_le", "pha_le", "pha_le"), Time = c(1L, 2L, 3L, 
4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 
18L, 19L, 20L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 1L, 2L, 3L, 4L, 
5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 
19L, 20L)), row.names = c(NA, -60L), class = "data.frame")

Ваша проблема в том, что вы смешиваете векторизованную функцию ifelse() с al oop. Как показывает @Ronak Shah, вам вообще не нужен al oop. Если вы хотите l oop, вам нужно использовать if{} и else{} и шагать по строкам:

for (i in 1:nrow(df)){
  if (df$Time[i] < 11) {prev <- df$Target[i]
       } else {df$Target[i]<-paste(prev, df$Target[i],sep = "_")}
}
print(df[c(1:2, 11:12, 21:22, 31:32, 41:42, 51:52), ], right=FALSE)
#    Target Time
# 1  pa      1  
# 2  pa      2  
# 11 pa_li  11  
# 12 pa_li  12  
# 21 ka      1  
# 22 ka      2  
# 31 ka_li  11  
# 32 ka_li  12  
# 41 pha     1  
# 42 pha     2  
# 51 pha_le 11  
# 52 pha_le 12  

Этот подход работает, но он будет медленнее, чем ifelse.

0 голосов
/ 21 апреля 2020

Вы можете попробовать этот метод рециркуляции векторизованного вектора:

inds <- rep(c(FALSE, TRUE), each = 10)
df$Target[inds] <- paste(df$Target[rev(inds)], df$Target[inds], sep = "_")

#   Target Time
#1      pa    1
#2      pa    2
#3      pa    3
#4      pa    4
#5      pa    5
#6      pa    6
#7      pa    7
#8      pa    8
#9      pa    9
#10     pa   10
#11  pa_li   11
#12  pa_li   12
#13  pa_li   13
#14  pa_li   14
#15  pa_li   15
#16  pa_li   16
#17  pa_li   17
#18  pa_li   18
#19  pa_li   19
#20  pa_li   20
#21     ka    1
#...

data

Убедитесь, что столбец Target является символом, а не фактором, прежде чем использовать приведенное выше решение. ,

df <- structure(list(Target = c("pa", "pa", "pa", "pa", "pa", "pa", 
"pa", "pa", "pa", "pa", "li", "li", "li", "li", "li", "li", "li", 
"li", "li", "li", "ka", "ka", "ka", "ka", "ka", "ka", "ka", "ka", 
"ka", "ka", "li", "li", "li", "li", "li", "li", "li", "li", "li", 
"li", "pha", "pha", "pha", "pha", "pha", "pha", "pha", "pha", 
"pha", "pha", "le", "le", "le", "le", "le", "le", "le", "le", 
"le", "le"), Time = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 
18L, 19L, 20L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L)), row.names = c(NA, 
-60L), class = "data.frame")
...