将 S4 对象转换为数据帧的一般方法 (R)
General way to transform S4 object to dataframe (R)
我有许多 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
.
的插槽
我不知道 "right" 的方法,因为我很少使用 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 ...
这里的方法是获取插槽名称,然后一次一个地迭代它们,将每个插槽的内容提取到一个列表中。然后给列表元素适当的名称(从插槽中),并将其绑定到数据帧中。
# 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
我有许多 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
.
我不知道 "right" 的方法,因为我很少使用 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 ...
这里的方法是获取插槽名称,然后一次一个地迭代它们,将每个插槽的内容提取到一个列表中。然后给列表元素适当的名称(从插槽中),并将其绑定到数据帧中。
# 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