【问题标题】:Assigning dataframe columns in rpy2在 rpy2 中分配数据框列
【发布时间】:2015-06-18 11:05:30
【问题描述】:

在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

运气不好

【问题讨论】:

    标签: python r rpy2


    【解决方案1】:

    这应该可行:

    i = dataf.colnames.index('a')
    dataf[i] = dataf[i].ro + 1
    

    【讨论】:

      【解决方案2】:

      事实证明这也有效:

      dataf.rx[True, 'a'] = dataf.rx(True, 'a').ro + 1
      

      编辑:

      但此解决方案并不完全等同于上述解决方案。它在这种情况下有效,但在其他情况下无效。

      例如

      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
      

      【讨论】:

        猜你喜欢
        • 2013-01-15
        • 1970-01-01
        • 1970-01-01
        • 2018-09-02
        • 2015-10-08
        • 2014-02-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多