2017-09-03 78 views
-1

我有兩個列表,我從API獲取。我需要比較R中的兩個列表來確定哪些項目出現在這兩個列表中。我曾希望用intersect()命令來做到這一點,但它不起作用。經過進一步的檢查,我注意到每個列表實際上是一個由逗號和轉義字符分隔的多個項目組成的單個向量。是否有可能將這些向量轉換爲多項目列表,以便我可以比較列表?下面是一些示例代碼:如何比較兩個字符向量與R中的轉義字符?

我想什麼:

> intersect(x,y) 
[[1]] 
[1] "c" 

我所看到的,而不是:

> intersect(x,y) 
list() 

> as.character(x) 
c(\"a\", \"b\", \"c\") 

> as.character(x) 
c(\"c\", \"d\", \"e\") 

這是怎麼回事?我如何比較x和y?有沒有辦法將這些向量轉換爲列表,以便我可以使用intersect()命令?

編輯:精緻的例子和澄清數據源

+1

你會顯示'dput(x)'和'str(x)'的輸出嗎?我只是好奇,如果'x'真的是一個字符向量開始,或者'as.character'強制字符。 – Aaron

+0

我無法複製你的錯誤。列表版本基於此代碼正常工作。雖然Ryan Runge在答案中指出,你應該使用'c()'而不是'list()' –

+0

這真的是'as.character'的確切輸出嗎?通常它會以'[1]'開頭,並且用引號括起字符串。 – Aaron

回答

2

我還在猜測在這裏,因爲你還沒有回答我的問題,我看你是越來越輸出一樣,唯一的辦法是,如果xy是第一個實際包含R代碼的列表,您可以使用它來創建所需的向量,如下所示。

x <- list('c("a", "b", "c")') 
y <- list('c("c", "d", "e")') 
intersect(x, y) 
## list() 
as.character(x) 
## [1] "c(\"a\", \"b\", \"c\")" 
as.character(y) 
## [1] "c(\"c\", \"d\", \"e\")" 

如果是這樣,你需要做的是計算這些表達式,然後你就會有,你認爲你有載體。

xx <- eval(parse(text=x[[1]])) 
yy <- eval(parse(text=y[[1]])) 
xx 
## [1] "a" "b" "c" 
yy 
## [1] "c" "d" "e" 
intersect(xx, yy) 

瑞安龍認爲,「擁有額外的引號這樣可以爲數據不同的語言或軟件之間共享更經常發生。因此,它可能是API如何被訪問的意想不到的效果。」 (謝謝!)

但是,這並不適用於您給出的解釋。需要更多信息!

-1

感謝您的建議,每個人。我能解決這個問題是這樣的:

intersect(as.list(as.character(x[[1]])),as.list(as.character(y[[1]]))) 

我真的不明白爲什麼把術語[[1]]每個列表名稱後解決了問題,但它似乎仍然。

+0

這是沒有足夠的信息來重現問題;如果你不提供它,我們將會關閉這個問題,因爲這對其他人沒有幫助。我希望你能提供更多的信息,因爲在我仍然好奇的問題中有一些有趣的觀點。 – Aaron