r - 将 S4 对象转换为数据帧的一般方法 (R)

标签 r dataframe s4

我有许多 S4 对象,它们具有可变数量的插槽和插槽名称。每个时隙中的数据长度相同。例如 S4 对象 peaks :

> str(peaks)
Formal class 'MassPeaks' [package "MALDIquant"] with 4 slots
  ..@ snr      : num [1:16] 37.81 9.18 8.65 4.66 53.22 ...
  ..@ mass     : num [1:16] 307 317 325 337 347 ...
  ..@ intensity: num [1:16] 2255 547 516 278 3173 ...
  ..@ metaData : list()

我想将这些 S4 对象转换为数据帧。例如数据框 df.peaks :
> str(df.peaks)
'data.frame':   16 obs. of  3 variables:
 $ snr      : num  37.81 9.18 8.65 4.66 53.22 ...
 $ mass     : num  307 317 325 337 347 ...
 $ intensity: num  2255 547 516 278 3173 ...

有没有通用的方法来做到这一点?对于这个例子,我可以做
> df.peaks = data.frame(snr=peaks@snr, mass=peaks@mass, intensity=peaks@intensity)

但这需要对 S4 对象的插槽名称进行硬编码。 如果不对插槽名称进行硬编码,我该怎么做? 我可以通过获取 s4.names = slotNames(peaks) 来做到这一点,但在这种情况下我不知道如何使用 s4.names访问 peaks 的插槽.

最佳答案

我不知道这样做的“正确”方法,因为我很少使用 S4 对象。不过,这是一个尝试:

# from the ?slot page
setClass("track", slots = c(x="numeric", y="numeric"))
myTrack <- new("track", x = -4:4, y = exp(-4:4))
str(myTrack)

Formal class 'track' [package ".GlobalEnv"] with 2 slots
  ..@ x: int [1:9] -4 -3 -2 -1 0 1 2 3 4
  ..@ y: num [1:9] 0.0183 0.0498 0.1353 0.3679 1 ...


这里的方法是获取插槽名称,然后一次一个地迭代它们,将每个插槽的内容提取到一个列表中。然后为列表元素提供适当的名称(来自插槽),并将其绑定(bind)到数据帧中。
# conversion function
S4_to_dataframe <- function(s4obj) {
  nms <- slotNames(s4obj)

  lst <- lapply(nms, function(nm) slot(s4obj, nm))
  as.data.frame(setNames(lst, nms))
}


S4_to_dataframe(myTrack)

   x           y
1 -4  0.01831564
2 -3  0.04978707
3 -2  0.13533528
4 -1  0.36787944
5  0  1.00000000
6  1  2.71828183
7  2  7.38905610
8  3 20.08553692
9  4 54.59815003

关于r - 将 S4 对象转换为数据帧的一般方法 (R),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57317958/

相关文章:

r - 按行将函数应用于某些列

python - 如何使用列中的值来确定要在不同数据框中分析哪一列?

r - 如何避免 uisng rbind 和 data.frame 的重复值?

python - 从 get_ipython().magic(u'R ...') 转换为简单的 r2py 命令

python - Pandas DF 列标题与列不对齐

python-3.x - Pandas.DataFrame.str.replace 函数将 float 替换为 NaN

r - 访问 S4 函数父类(super class)的槽

r - 如何在R中将插槽的默认值设置为NULL?

r - R中的method_missing等价物

r - 从一台 Linux 服务器复制旧的 R 包并将它们安装在新服务器上