Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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
在dataframe中搜索唯一值并使用它们创建表_R_Search_Transpose - Fatal编程技术网

在dataframe中搜索唯一值并使用它们创建表

在dataframe中搜索唯一值并使用它们创建表,r,search,transpose,R,Search,Transpose,自从不久前我开始使用R

自从不久前我开始使用R<以来,我发现这个网站在帮助我构建脚本方面非常有用。我又一次遇到了一个挑战,我似乎在任何地方都找不到答案。这是我的问题:在我的数据中有一列,每行包含不同的URL。在每一个URL中都有我想要提取的特定信息。目前我在excel中做这件事,因为有人告诉我在R中做不到,而且没有函数可以做这件事

URL将类似于此示例格式,它将在“源”列中找到

URL中对我很重要的部分是“utm_source=ADX”位。我的数据如下所示:

用户/来源

1/

2/

3/

我需要做的是从URL捕获utm_源,并将信息转换到不同的列中,示例如下:

用户/源/utm\U源

1/谷歌点击/ADX和ID56789

2/谷歌点击/ADW&ID56009

3/谷歌点击/ADWords和ID53389

因此,本质上我需要R在整个数据帧中搜索值“utm_source=”,一旦找到它们,我希望它将“utm_source=”值转换为一个列名,并为每一行复制该列“=”后面的所有信息。我知道“grep”是一个在datafreme中定位特定信息的函数,例如data没有什么是不可能的

x <- read.csv(text="
User, Source
1, http://www.googleclick.com?utm_source=ADX&ID56789
2, http://www.googleclick.com?utm_source=ADW&ID56009
3, http://www.googleclick.com?utm_source=ADWords&ID53389
", header=TRUE, stringsAsFactors=FALSE)
然后找一把火红的扑克,插在你所谓顾问的眼睛里


编辑:

正如Paul Hiemstra所建议的,您也可以直接使用正则表达式:

gsub(".*\\?utm_source=", "", x$Source)
[1] "ADX&ID56789"     "ADW&ID56009"     "ADWords&ID53389"

@安德烈的回答起了作用。下面是另一种使用
regmatches
gregexpr
的方法,可能会很有用

d <- read.table(text="User URL
1 http://www.googleclick.com?utm_source=ADX&ID56789
2 http://www.googleclick.com?utm_source=ADW&ID56009
3 http://www.googleclick.com?utm_source=ADWords&ID53389", header=TRUE)

domain.pat <- '((?<=www.)([[:alnum:]_]+))'
source.pat <- '((?<=utm_source=)([[:alnum:]&]+))' # exclude the '&' here to only grab up to the '&'
all.matches <- gregexpr(paste(domain.pat, source.pat, sep='|'), d$URL, perl=TRUE)
all.substrings <- regmatches(d$URL, all.matches)
do.call(rbind, all.substrings)

#      [,1]          [,2]             
# [1,] "googleclick" "ADX&ID56789"    
# [2,] "googleclick" "ADW&ID56009"    
# [3,] "googleclick" "ADWords&ID53389"

d+1,但是基于正则表达式的解决方案可能更健壮。有趣的是,有人会说在R中不可能,但在Excel中却可以。我只知道其他的例子。非常感谢你的及时回答。你们真的很了解自己。strsplit似乎不适用于strsplit(file1$Source,split=“\\?utm\u Source=“):非字符参数中的错误。不知道这个错误意味着什么。gsub似乎可以工作,但它将我的新子集创建为值,因此我无法将其编写为csv。我需要添加as.character之类的内容吗?@DavidRogers您的第一个错误是因为您的数据是一个因素,而不是一个字符。使用
stringsAsFactors=FALSE
读取.csv()
时,如我在代码中所示。在这两种情况下,您都需要将拆分操作的结果分配给data frame.file1中的一列。如果有人说R中不可能出现某些情况,请不要信任他们。如果他们说可以在excel中运行,请运行!:))我知道,我知道Excel并不是一个真正的数据统计学家的软件,Excel有它的价值,但对于数据分析来说,R要强大得多。你能解释一下当你尝试的时候,安德里的建议是如何起作用的吗?就我而言,情况并非如此。直到do.call(rbind,all.substring)的时候,你的工作才停止。当我试图将其子集(因为我需要将其导出为csv)时,它会给我一个字符矩阵。因此,为了清楚起见,我想要的输出是一个包含以下列的子集:Col1-userID、Col2-utm_source(在该列的每一行中,每一行上都应该有最初出现在URL中=和&)之间的内容(ADW或ADX或ADWords)。我希望这是有意义的:)@David显然在您的
data.frame
中,URL是
类型的
因子。它们必须是
字符
,才能起作用。您可以遵循Andrie的建议,在读取数据时使用
stringsAsFactors=FALSE
,或者将
d$URL
替换为
as.character(d$URL)
,在我提供的示例中。您能告诉我您的版本应该是什么样的公式吗?基本上,将data.frame转换为字符的函数是什么?如果我有一个名为“Users”的文件如何转换它。我知道这对你来说可能是难以置信的基础,但对于一些对R知之甚少的人来说,一切都是一个挑战。:)我尝试将其作为.character(Users$URL)使用,但它只显示了1000行数据,并说[reach getOption(“max.print”)--省略了191016个条目]
d <- read.table(text="User URL
1 http://www.googleclick.com?utm_source=ADX&ID56789
2 http://www.googleclick.com?utm_source=ADW&ID56009
3 http://www.googleclick.com?utm_source=ADWords&ID53389", header=TRUE)

domain.pat <- '((?<=www.)([[:alnum:]_]+))'
source.pat <- '((?<=utm_source=)([[:alnum:]&]+))' # exclude the '&' here to only grab up to the '&'
all.matches <- gregexpr(paste(domain.pat, source.pat, sep='|'), d$URL, perl=TRUE)
all.substrings <- regmatches(d$URL, all.matches)
do.call(rbind, all.substrings)

#      [,1]          [,2]             
# [1,] "googleclick" "ADX&ID56789"    
# [2,] "googleclick" "ADW&ID56009"    
# [3,] "googleclick" "ADWords&ID53389"