R:如何有条件地用来自另一个数据帧的随机采样行替换数据帧中的行?

时间:2019-03-25 09:33:30

标签: r

我需要有条件地将数据帧(x)中的行替换为从另一个数据帧(y)中随机选择的行。两个数据帧之间的某些行是相同的,因此数据帧x将包含带有重复的信息。我需要哪种基本的r代码?

我正在r中编写一个基于代理的模型,其中行可以被视为与代理相关的属性的向量,而列是属性类型。为使代理传输其属性,他们需要将行从一个数据帧(填充)发送到另一数据帧,但要根据条件学习规则。这些规则必须是:如果该行的第10列中的属性的值为1或更大,并且概率s大于0到1之间的随机选择的值,则有条件替换数据帧x中第n行的值。可调参数,可以采用0到1之间的任何值。

我在下面的代码中尝试过IF函数,但是我是r的新手,并且在收到此警告时在某个地方犯了一个错误:

  

“缺少需要TRUE / FALSE的值”

我认为,如果条件不满足,我还没有指定应该怎么做。

我想不出另一种实现目标的方法。

注意:agent.dat是数据帧xtop_ten_percent是数据帧y

s = 0.7
N = nrow(agent.dat)

copy <- runif(N)   #to generate a random probability for each row in agent.dat


    for (i in 1:nrow(agent.dat)){
        if(agent.dat[,10] >= 1 & copy < s){
            agent.dat <- top_ten_percent[sample(nrow(top_ten_percent), 1), ]
        }
    }

如果agent.dat数据框中的行在0和1之间随机选择的复制值小于该行的值,则该行应替换为top_ten_percent数据框中的行中的值。参数s以及第10列中该行的值是1还是更大。对于每一行,我需要将agent.dat的前10列替换为top_ten_percent的前10列(不包括第11列,即复制值)。

非常感谢您对这个问题的帮助。

2 个答案:

答案 0 :(得分:0)

这将解决您的错误,假设您的数据结构适合您的代码:

copy <- runif(nrow(agent.dat))

s <- 0.7

for (i in 1:nrow(agent.dat)){
        if(agent.dat[i,10] >= 1 & copy[i] < s){
            agent.dat[i,] <- top_ten_percent[sample(1:nrow(top_ten_percent), 1), ]
        }
    }

答案 1 :(得分:0)

所以您只需要更改一些内容即可。

对于for循环的每次迭代,您都需要为private Action CreateAction(MethodInfo method) { Type requestType = method.GetParameters()[0].ParameterType, actionType = typeof(Action<>).MakeGenericType(requestType); return (Action) Delegate.CreateDelegate(actionType, this, method); } public void Invoke(Thing thing, string json) { Type requestType = MyAction.GetParameters()[0].ParameterType; var o = Deserialize(json, requestType); thing.MyAction(o); } 获取一个特定值(使用:copy)。

您还需要在if语句中将copy[i]设置为&Boolean operators && and ||

然后,您需要替换&&中的特定行(以及第1至10列),而不是整个内容(agent.dat

因此,最终代码应如下所示:

agent.dat[i,1:10]