我有一个这样的数据帧:
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
慢。