如何根据R中的最后一行在所选行中添加前缀

问题描述 投票:1回答:2

我有一个像这样的数据框:

 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
..."

并且我想基于1〜10的目标在11〜20的目标之前添加前缀。我希望是:

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

我以为我需要先遍历数据并使用条件语句,所以我尝试了:

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

但是它不起作用...我想知道我的逻辑是正确的还是该语句有问题? ..我是R的新手,真的希望有人能提供帮助!非常感谢!

r if-statement prefix
2个回答
0
投票
您可以尝试使用这种向量化向量回收方法:

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

数据

尝试上述解决方案之前,请确保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")


0
投票
以后使用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()与循环混合。如@Ronak Shah所示,您根本不需要循环。如果要循环,则需要使用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慢。
© www.soinside.com 2019 - 2024. All rights reserved.