我需要有条件地将数据帧(x)中的行替换为从另一个数据帧(y)中随机选择的行。两个数据帧之间的某些行是相同的,因此数据帧x将包含带有重复的信息。我需要哪种基本的r代码?
我正在r中编写一个基于代理的模型,其中行可以被视为与代理相关的属性的向量,而列是属性类型。为使代理传输其属性,他们需要将行从一个数据帧(填充)发送到另一数据帧,但要根据条件学习规则。这些规则必须是:如果该行的第10列中的属性的值为1或更大,并且概率s大于0到1之间的随机选择的值,则有条件替换数据帧x中第n行的值。可调参数,可以采用0到1之间的任何值。
我在下面的代码中尝试过IF
函数,但是我是r的新手,并且在收到此警告时在某个地方犯了一个错误:
“缺少需要TRUE / FALSE的值”
我认为,如果条件不满足,我还没有指定应该怎么做。
我想不出另一种实现目标的方法。
注意:agent.dat
是数据帧x
,top_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列,即复制值)。
非常感谢您对这个问题的帮助。
答案 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]