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



我有一个这样的数据帧:

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的新手,真的希望有人能帮忙!非常感谢!!

您可以尝试这种矢量化矢量回收方法:

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

将来使用dput()插入数据。它保留了打印输出没有的细节,例如目标是一个因子或字符字段:

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慢。

相关内容

  • 没有找到相关文章

最新更新