如何根据R中的最后一行在所选行中添加前缀
Posted
技术标签:
【中文标题】如何根据R中的最后一行在所选行中添加前缀【英文标题】:how to add prefix in selected rows according to the last row in R 【发布时间】:2020-04-21 03:15:17 【问题描述】:我有一个这样的数据框:
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 新手,真的希望有人能提供帮助!非常感谢!!
【问题讨论】:
请修正您的格式。 【参考方案1】:你可以试试这个矢量化矢量回收方法:
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")
【讨论】:
哇!非常感谢!!是的,我在尝试您的方法之前添加了 df$Target 【参考方案2】:以后使用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
慢。
【讨论】:
以上是关于如何根据R中的最后一行在所选行中添加前缀的主要内容,如果未能解决你的问题,请参考以下文章
c# wpf datagrid 模板列修改某个单元格,更新所选行另一个单元格的值,如何做到呢?