我很难理解在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