我有一个稍微复杂的数据结构,有一个列表列表,每个列表又包含不同长度的数字矢量。我需要根据与主列表长度相同的单独向量,用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);
}
答案 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
遍历list
和vector
的每个元素,以及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