我从API获得了两个列表。我需要比较R中的两个列表以确定两个列表中存在哪些项目。我曾希望用intersect()命令做到这一点,但它没有用。经过进一步检查,我注意到每个列表实际上是一个单独的向量,包含由逗号和转义字符分隔的多个项目。是否可以将这些向量转换为多项列表,以便我可以比较列表?以下是一些示例代码:
我想要的是什么:
> 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()命令?
编辑:精炼示例和澄清数据源
答案 0 :(得分:2)
我仍然在猜这里,因为你没有回答我的问题,但是我看到你获得这样的输出的唯一方法是x
和y
列表是实际上包含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)
Ryan Runge建议“在不同语言或软件之间共享数据时,更频繁地发生这样的额外报价。因此,这可能是API访问方式的意外影响。” (谢谢!)
然而,这不适用于您给出的解释。需要更多信息!
答案 1 :(得分:-1)
感谢大家的建议。我能够像这样解决这个问题:
$eventList = $cal->events->listEvents(
'primary',
array(
'timeMin' =>''.$pastEvents.'T01:00:00Z',
'timeMax' =>''.$futureEvents.'T23:59:59Z',
'singleEvents' => true
)
);
$eventItems = $eventList['items']; //From Google
$x=0;
$events = array();
$startDateTime ='';
$endDateTime ='';
$summary = '';
$start = array();
$end = array();
foreach($eventItems as $item) {
if(isset($item['summary'])) {
$summary = $item['summary'];
}
$start = $item['start'];
if(isset($start['dateTime'])) {
$startDateTime = $start['dateTime'];
}
else if(isset($start['date'])) {
$startDateTime = $start['date'];
}
$end = $item['end'];
if(isset($end['dateTime'])) {
$endDateTime = $end['dateTime'];
}
else if(isset($end['date'])) {
$endDateTime = $end['date'];
}
$events[$x]['id'] = $item['id'];
$events[$x]['title'] = $summary;
$events[$x]['start'] = $startDateTime;
$events[$x]['end'] = $endDateTime;
$events[$x]['allDay'] = true;
$events[$x]['backgroundColor'] = '#0092D0';
$x++;
}
$jsonEvents = json_encode($events);
我真的不明白为什么在每个列表名称之后加上术语[[1]]可以解决问题,但似乎仍然如此。