如何根据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 所示,您根本不需要循环。如果您想要循环,则需要使用ifelse 并逐行遍历:

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中的最后一行在所选行中添加前缀的主要内容,如果未能解决你的问题,请参考以下文章

如何从 agggrid 中的选定行中删除蓝色

当所选行是最后一行之前的行时自动滚动表格

c# wpf datagrid 模板列修改某个单元格,更新所选行另一个单元格的值,如何做到呢?

R - 基于特定因子值对所选行和列中的数值求和

Vue Good Table 如何访问 Selected Row Actions 中的数据

从所选行中检索表ID