Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 此搜索和返回问题有问题_R - Fatal编程技术网

R 此搜索和返回问题有问题

R 此搜索和返回问题有问题,r,R,我正在研究这个问题,我在Excel中通过匹配函数和if/isnumber混合公式找到了解决方案,并通过if语句找到了Alteryx,但我在找到解决方案时遇到了困难 Excel示例:=IF(ISNUMBER(搜索(C$1,$B2)),1,0) 本质上,问题是如果audid行1(“ab1”)包含“abc”,则列abc单元格行1应接收1(如果不是0)。现在,列可以扩展到1000种可能性,因此代码必须灵活地通过更改列名来运行 当前 | sid | audid | abc | abcd

我正在研究这个问题,我在Excel中通过匹配函数和if/isnumber混合公式找到了解决方案,并通过if语句找到了Alteryx,但我在找到解决方案时遇到了困难

Excel示例:
=IF(ISNUMBER(搜索(C$1,$B2)),1,0)

本质上,问题是如果audid行1(“ab1”)包含“abc”,则列abc单元格行1应接收1(如果不是0)。现在,列可以扩展到1000种可能性,因此代码必须灵活地通过更改列名来运行

当前

| sid |     audid      | abc | abcd | abcde |
|-----|----------------|-----|------|-------|
| ab1 | abc,abcd,abcde | NA  | NA   | NA    |
| ab2 | abcd           | NA  | NA   | NA    |
| ab3 | abcd,abc       | NA  | NA   | NA    |
| ab4 | abcde          | NA  | NA   | NA    |
渴望的

| sid |     audid      | abc | abcd | abcde |
|-----|----------------|-----|------|-------|
| ab1 | abc,abcd,abcde |   1 |    1 |     1 |
| ab2 | abcd           |   0 |    1 |     0 |
| ab3 | abcd,abc       |   1 |    1 |     0 |
| ab4 | abcde          |   0 |    0 |     1 |

任何建议或暗示都会很棒。提前谢谢你

这主要是重塑为宽格式的问题,但首先需要重新排列和分隔逗号分隔的字符串。在tidyverse语法中

库(tidyverse)
df%
变异(audid2=audid,#复制以避免删除原始
n=1)%>%#添加现有值的列以扩展为宽格式
分隔行(audid2)%>%#将逗号分隔的字符串分隔为长格式
扩展(audid2,n,fill=0)#重塑为宽形状
#>#A tibble:4 x 5
#>sid audid abc abc abc abc abc abc abc abc
#>                
#>1 ab1 abc,abc,abcde 1
#>2 ab2 abcd 0 1 0
#>3 ab3 abc,abc 1 10
#>4 ab4 abcde 0 1

这里有一个选项使用
qdapTools

library(qdapTools)
cbind(df1,  mtabulate(strsplit(df1$audid, ",")))
#  sid          audid abc abcd abcde
#1 ab1 abc,abcd,abcde   1    1     1
#2 ab2           abcd   0    1     0
#3 ab3       abcd,abc   1    1     0
#4 ab4          abcde   0    0     1

如果您想坚持使用基本R,那么嵌套lappy或for循环将有所帮助

df <- data.frame(audit = c("abc,abcd,abcde", "abcd", "abc", "abcde"))

#            audit
# 1 abc,abcd,abcde
# 2           abcd
# 3            abc
# 4          abcde

audits <- strsplit(df$audit, ",")

for (row in 1:length(audits)) {
    for (audit in audits[[row]]) {
        df[row, audit] <- 1
    }
}

df[is.na(df)] <- 0

#            audit abc abcd abcde
# 1 abc,abcd,abcde   1    1     1
# 2           abcd   0    1     0
# 3            abc   1    0     0
# 4          abcde   0    0     1
df