R使用各自的列值遍历data.frame行,返回任何匹配列值的串联列名

  • 本文关键字:任何匹 返回 data 遍历 frame r
  • 更新时间 :
  • 英文 :


我很难理解在r中执行此操作所需的步骤。实际上,我试图获取行值,并将其字符串与数据框架中的所有其他列进行比较,返回存在匹配的列名的串联列表。只取要匹配的QB_slate_team列值,我想在最右边创建QB_Match列。显示team_stack_count表的期望输出:

QB_slate_team  RB_slate_team  WR_slate_team  QB_Match
SEA            IND            GB             NA-NA
GB             LV             GB             NA-WR_slate_team

[详细- team_stack_count表突出显示匹配字符串的问题,以及所需的输出列格式][1]: https://i.stack.imgur.com/Pxjs0.png

例如,如果QB_slate_team column row value = "GB"和WR_slate_team列行值= "GB"对于不匹配的列,我希望新创建的QB_Match连接列在其他NAs中包含WR_slate_team。

在尝试了一堆不同的语句之后,这是我最接近的:

team_stack_count$QB_Match <- apply(team_stack_count, 1, function(x) paste(names(x[x==team_stack_count$QB_slate_team]), collapse="-"))

但是由于某种原因,它所匹配的team_stack_count$QB_slate_team似乎是一个随机的静态团队名称,而不是遍历行以获得每个行应用程序的适当值。

好奇,有没有办法使QB_slate_team行动态匹配基础?(我相信我可能误解了apply语句以及它是如何工作的——我对任何可能有帮助的函数都是开放的)

下面的代码实现了数据的旋转。

library(dplyr)
library(tidyr)
library(stringr)
df %>%
pivot_longer(-QB_slate_team) %>%
mutate(match = if_else(QB_slate_team == value, name, 'NA')) %>%
group_by(QB_slate_team) %>%
mutate(QB_Match = str_c(match, collapse = '-')) %>%
ungroup() %>%
select(-match) %>%
pivot_wider(names_from = name) %>%
select(- QB_Match, QB_Match)
#   QB_slate_team RB_slate_team WR_slate_team QB_Match        
#   <chr>         <chr>         <chr>         <chr>           
# 1 SEA           IND           GB            NA-NA           
# 2 GB            LV            GB            NA-WR_slate_team

df <- structure(list(QB_slate_team = c("SEA", "GB"), RB_slate_team = c("IND", 
"LV"), WR_slate_team = c("GB", "GB")), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"))

您可以使用apply作为:

team_stack_count$QB_Match <- apply(team_stack_count, 1, function(x) {
cols <- names(x)[-1]
cols[x[-1] != x[1]] <- NA
paste0(cols, collapse = '-')
})
team_stack_count
#  QB_slate_team RB_slate_team WR_slate_team         QB_Match
#1           SEA           IND            GB            NA-NA
#2            GB            LV            GB NA-WR_slate_team

team_stack_count <- structure(list(QB_slate_team = c("SEA", "GB"), 
RB_slate_team = c("IND", "LV"), 
WR_slate_team = c("GB", "GB")), class = "data.frame", row.names = c(NA, -2L))

还有一个名为libr的包,其中包含一个datastep()函数,可以做到这一点,并使其更具可读性。

函数将遍历每一行,并允许您跨行编写条件。你遇到了一个棘手的情况,因为你也在遍历这些列。但是datastep()函数有一些特性可以解决这个问题。在下面的代码中,您将看到表示输入数据的data对象和表示当前行号的n.变量。这是从数据步内动态访问列值的一种方法。

这个包中包含的%eq%操作符如果遇到NA值也不会失败。因此,它比双等号(==)更安全。

library(libr)

df <- data.frame(QB_slate_team = c("SEA", "GB"),
RB_slate_team = c("IND", "LV"),
WR_slate_team = c("GB", "GB"))

df2 <- datastep(df, 
drop = c("nm", "val"), {

# Initialize QB_Match
QB_Match <- ""

# Loop through all columns except first
for (nm in names(data)[-1]) {

# Get appropriate value
val <- ifelse(QB_slate_team %eq% data[[n., nm]], nm, "NA")
# Initialize or append val to QB_Match
QB_Match <- ifelse(QB_Match %eq% "", val, paste0(QB_Match, "-", val))
}
})

结果如下:

# QB_  slate_team RB_slate_team WR_slate_team         QB_Match
# 1           SEA           IND            GB            NA-NA
# 2            GB            LV            GB NA-WR_slate_team

相关内容

最新更新