在rpy2中,相当于说:
dataf <- data.frame(a=c(1,2,3), b=c(4,5,6))
dataf$a <- dataf$a + 1
由于dataframe.rx2
是等效于[[.dataframe
的rpy2,我原以为答案应该是:
d = {'a': robjects.IntVector((1,2,3)), 'b': robjects.IntVector((4,5,6))}
dataf = robjects.DataFrame(d)
dataf.rx2["a"] = dataf.rx2("a").ro + 1
但是会出现以下错误:
RRuntimeError: Error in `[[<-.data.frame`(list(a = 1:3, b = 4:6), "a", 2:4) :
argument "value" is missing, with no default
我也尝试过:
dataf.rx["a"] = dataf.rx("a").ro + 1
dataf[dataf.index("a")] = dataf.rx2("a").ro + 1
没有运气
答案 0 :(得分:2)
这应该有效:
i = dataf.colnames.index('a')
dataf[i] = dataf[i].ro + 1
答案 1 :(得分:1)
事实证明这也有效:
dataf.rx[True, 'a'] = dataf.rx(True, 'a').ro + 1
编辑:
但是这个解决方案并不完全等同于上述解决方案。它适用于这种情况,但不适用于其他情况。
e.g。
In [18]: d = {"a": ro.StrVector(["a","b","c"]), "b": ro.IntVector([1,2,3])}
In [19]: dataf = ro.DataFrame(d)
In [20]: print ro.r.levels(dataf.rx2("a"))
[1] a b c
In [21]: dataf.rx[True, "a"] = ro.r.relevel(dataf.rx2("a"), "b")
In [22]: print ro.r.levels(dataf.rx2("a"))
[1] a b c
接受的解决方案在哪里:
In [23]: i = dataf.colnames.index("a")
In [24]: dataf[i] = ro.r.relevel(dataf.rx2("a"), "b")
In [25]: print ro.r.levels(dataf.rx2("a"))
[1] b a c