l / sapply忽略条件替换

时间:2018-07-01 20:40:42

标签: r list loops replace lapply

我有一个稍微复杂的数据结构,有一个列表列表,每个列表又包含不同长度的数字矢量。我需要根据与主列表长度相同的单独向量,用NA替换向量中的某些值。但是,R不仅替换了特定的值,还替换了整个向量。贝娄,一个例子:

#ifndef INC_4NEURO_NEURONLINEAR_H
#define INC_4NEURO_NEURONLINEAR_H

#include "Neuron.h"

/**
 * Linear neuron class - uses activation function in the form f(x)=a*x + b,
 * 'x' being the neuron's potential
 */
class NeuronLinear:public Neuron {
public:
    // OTHER METHODS

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version);
};

#endif //INC_4NEURO_NEURONLINEAR_H

请注意,不管替换的具体值如何,都会发生相同的情况(例如,如果不是NA,而是将替换值更改为0,那么无论条件如何,0都会替换所有值)。

这是怎么回事?为什么lapply / sapply忽略了条件?

顺便说一句,我欢迎提出建议而无需任何for循环。

编辑:除了编辑上面的代码以使我清楚地知道替换是基于单独的向量(因此是for循环)之外,ifelse还能得到我想要的东西。但是,我还是不明白为什么l / sapply无法识别选择和替换为括号。我希望对此有任何解释,以及如何无循环执行此操作。

ifelse代码:

#include <boost/serialization/base_object.hpp>
#include "NeuronLinear.h"

template<class Archive>
void NeuronLinear::serialize(Archive & ar, const unsigned int version) {
    ar & boost::serialization::base_object<Neuron>(*this);
}

1 个答案:

答案 0 :(得分:2)

sapply元素的每个元素上都不需要运行list,因为我们可以矢量化的方式进行操作。

lapply(mylist, function(x) replace(x, x <=1, NA))

或带有for循环

for(i in seq_along(mylist)) mylist[[i]] <- replace(mylist[[i]], 
                          mylist[[i]] <=1, NA)

请注意,OP更改了条件,即创建与“ mylist”长度相同的向量(“ myvec”),并希望将与“ mylist”的相应元素匹配的那些值替换为NA。它可以通过很多方式来完成。一种选择是Map遍历listvector的每个元素,以及replace与NA匹配的值。

Map(function(x, y) replace(x, x == y, NA), mylist, myvec)
#[[1]]
#[1] NA  2  3

#[[2]]
#[1]  1 NA  3

#[[3]]
#[1]  1  2 NA

或带有for循环

for(i in seq_along(mylist)) mylist[[i]] <- replace(mylist[[i]], 
                      mylist[[i]] == myvec[i], NA)

或者通过遍历序列使用lapply

lapply(seq_along(mylist) function(i) 
          replace(mylist[[i]], mylist[[i]] == myvec[i], NA))

关于OP为什么仅获得NA的原因,在sapply中,返回值是对NA的赋值,而不是对象本身。在此处检查lapply/sapply的输出

lapply(mylist[[1]], function(x) x[x==myvec[1]] <- NA)
#[[1]]
#[1] NA

#[[2]]
#[1] NA

#[[3]]
#[1] NA

它是赋值,而不是'x'。返回“ x”以获取“ x”的输出(如@ user20650注释)

lapply(mylist[[1]], function(x) {x[x==myvec[1]] <- NA; x})
#[[1]]
#[1] NA

#[[2]]
#[1] 2

#[[3]]
#[1] 3