我有一个像这样的数据框:
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()
插入数据。它保留打印输出所不包含的详细信息,例如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
慢。