gpt4 book ai didi

r - 从 R 中的变量列表中创建一个变量?

转载 作者:行者123 更新时间:2023-12-04 10:59:52 24 4
gpt4 key购买 nike

我在数据框中有一系列变量(超过 100 个),我想为任何变量中是否存在特定文本模式创建一个指示变量。下面是一个包含三个变量的示例。我发现的一种解决方案是使用 tidyr::unite()其次是 dplyr::mutate() ,但我对无需统一变量的解决方案感兴趣。

c1<-c("T1", "X1", "T6", "R5")
c2<-c("R4", "C6", "C7", "X3")
c3<-c("C5", "C2", "X4", "T2")

df<-data.frame(c1, c2, c3)

c1 c2 c3
1 T1 R4 C5
2 X1 C6 C2
3 T6 C7 X4
4 R5 X3 T2

code.vec<-c("T1", "T2", "T3", "T4") #Text patterns of interest
code_regex<-paste(code.vec, collapse="|")

new<-df %>%
unite(all_c, c1:c3, remove=FALSE) %>%
mutate(indicator=if_else(grepl(code_regex, all_c), 1, 0)) %>%
select(-(all_c))

c1 c2 c3 indicator
1 T1 R4 C5 1
2 X1 C6 C2 0
3 T6 C7 X4 0
4 R5 X3 T2 1

以上是产生所需结果的示例,但是我觉得在 tidyverse 中应该有一种方法可以做到这一点无需统一变量。这是 SAS 使用 ARRAY 很容易处理的事情。声明和 DO循环,我希望 R 有一个很好的方法来处理这个问题。

除了要搜索的“c”字段之外,真实的数据框还有许多额外的变量,因此涉及搜索每一列的解决方案需要将数据框子集化为首先只包含我想要搜索的变量,然后将数据与另一个连接起来变量。

最佳答案

使用基础 R,我们可以使用 sapply并使用 grepl在每一列中查找模式并将 1 分配给超过 0 个匹配项的行。

df$indicator <- as.integer(rowSums(sapply(df, grepl, pattern = code_regex)) > 0)

df
# c1 c2 c3 indicator
#1 T1 R4 C5 1
#2 X1 C6 C2 0
#3 T6 C7 X4 0
#4 R5 X3 T2 1

如果其他列很少,并且我们有兴趣仅将其应用于以 "c" 开头的列我们可以使用 grep过滤它们。
cols <- grep("^c", names(df))
as.integer(rowSums(sapply(df[cols], grepl, pattern = code_regex)) > 0)

使用 dplyr我们可以做的
library(dplyr)

df$indicator <- as.integer(df %>%
mutate_at(vars(c1:c3), ~grepl(code_regex, .)) %>%
rowSums() > 0)

关于r - 从 R 中的变量列表中创建一个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55795925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com