根据R中另一个列表中的数字删除列表中的特定项目

时间:2015-07-10 04:19:23

标签: r list elements

我有两个列表,一个包含不同长度的字符值(dat),另一个列表包含每个元素中的单个数值(delete_n)。

#include <iostream>
#include <map>
#include <string>
using namespace std;

class My_class
{
public:
    void method_1() { wcout << "method_1\n"; }
    void method_2() { wcout << "method_2\n"; }
    void method_3() { wcout << "method_3\n"; }
};

auto method_name() -> string { return "method_3"; }

auto main() -> int
{
    map<string, void (My_class::*)()> methods =
    {
        { "method_1", &My_class::method_1 },
        { "method_2", &My_class::method_2 },
        { "method_3", &My_class::method_3 },
    };

    My_class example;
    (example.*methods.at( method_name() ))();
}

&#34; delete_n&#34;中的元素与&#34; dat&#34;中的元素配对(delete_n [1]与dat [1]一起使用,依此类推)。 &#34; delete_n&#34;数字(0,2,1)告诉我每行需要删除的每个元素中有多少具体的列表项。

基于这个例子,我正在寻找一种解决方案,它将从dat [1]删除0项,删除&#34; Blue&#34;和&#34;格林&#34;来自dat [2]和&#34; Mazda&#34;来自dat [3]。

我首先尝试匹配元素编号,然后通过以下变体识别元素列表索引,但没有成功。 mapply可能更合适,但我还不清楚如何编写function()部分。

dat <- list(c("Apple", "Pear"), c("Red", "Blue", "Green"), c("Toyota", "Mazda"))
delete_n <- list(0, 2, 1)

3 个答案:

答案 0 :(得分:5)

mapply(function (x, n) {
    # x is an element of dat; n is an element of delete_n
    x[seq_len(length(x)-n)]
}, dat, delete_n)

说明:

mapply将函数应用于datdelete_n的每个元素,一起使用(所有第一个元素,所有第二个元素等)。

seq_len(i)生成向量1:i,因此seq_len(length(x)-n)会选择n的所有x个元素。{/ p>

答案 1 :(得分:3)

仅仅因为我不能在没有让head工作的情况下放手一搏:
如果您将delete_n更改为向量c(0,2,1)(由于每个对应的dat列表项只有一个值,因此可以轻松实现),您可以这样做:

Map(head, dat, n=-replace(delete_n, delete_n==0, -Inf))

答案 2 :(得分:3)

我喜欢mapply方法,但这对我来说似乎很自然(无论如何都会以负零点失败)。

 mapply( head, dat, sapply(dat, length )- unlist(delete_n ))
#-------
[[1]]
[1] "Apple" "Pear" 

[[2]]
[1] "Red"

[[3]]
[1] "Toyota"