在R中的数据帧上使用近似值保留类型因子的列



我有一个有很多列的大数据帧。其中一些是双重类型,另一些是类型因子。我通过使用approx函数和方法="constant"添加一个新列"time"来对数据帧重新采样。之后,所有因子列都将更改为双因子列。

例如:

So my idea looks like this:
time = seq(1, 6, by = 0.1)
df1 <- data.frame(ecuTime = c(2, 4, 6), a = as.factor(c("male", "female", 
"male")), b = c(1, 3, 5))
df2 <- data.frame(ecuTime = c(1, 3.2, 3.4, 6), c = as.factor(c("car", "car", 
"bike", "car")), d = c(2, 3, 5, 6))
dfComb <- merge(df1, df2, by = "ecuTime", all = TRUE)
approxData <- cbind.data.frame(time, sapply(dfComb[, names(dfComb)], 
function(y, x, nout) 
approx(x, y, nout, method = "constant", na.rm = FALSE)$y,
x = dfComb$ecuTime, nout = time))

即使我使用函数approx,是否可以将factor列保持为factor,将double类型的列保持为double?

编辑:我发现在因子上使用近似函数是没有意义的,也不想使用na.rm=TRUE,因为我在一些列中有很多na,如果我用以前的值替换它们,那么关于分布等的原始数据将有很大的差异。有没有一种替代方案,只对非因子列执行近似函数,然后将其与原始因子列合并?我认为不用以前的值填充因子列,只使用与重新采样时间相关的原始值(如0.1、0.2等(是有意义的。之后可以合并。

我只是困惑于如何将df1和df2与重新采样的时间频率相结合,所以我的分布和线图与原始数据完全不同。我想实现的最终目标是在特定的时间框架内对一些特定的因素进行比较。所以我不能比较不同的变量,因为另一个变量可能是NA

所以,我不清楚你在这里要做什么,这很好;我对这个具体问题理解得很好。然而,我相信你真的,真的很确定这是个好主意——从表面上看,我会非常担心通过approx()函数对因子变量的基本整数进行类似算术的运算(这完全没有意义(。在我看来,可能有一种"更好"(即不那么棘手(的方法来完成这项工作,但我无法帮助你做到这一点,因为我不清楚你的总体目标。

也就是说,这里有一个可能的路线图,可以使用baseR:来做你想做的事情

  • 确定哪些变量应该是因素
  • approxData中,将这些变量转换回因子类型
  • 基于来自df的对应值重新映射新因子变量的levels

代码,用一个额外的因子列展开(以验证它在有多个因子变量的情况下是否正确运行(:

time = 1:6
df <- data.frame(ecuTime = c(2, 4, 6), a = as.factor(c("male", "female", 
"male")), b = c(1, 3, 5),
c = c("blue", "blue", "yellow"))
str(df)
approxData <- cbind.data.frame(time, sapply(df[, names(df)], 
function(y, x, nout) 
approx(x, y, nout, method = "constant")$y,
x = df$ecuTime, nout = time))
str(approxData)
factor_vars <- names(df[, sapply(df, is.factor)])
approxData[, factor_vars] <- 
lapply(factor_vars, function(x) {
approxData[[x]] <- factor(approxData[[x]]); 
levels(approxData[[x]]) <- levels(df[[x]]); 
approxData[[x]]
})
str(approxData)

对于编辑后的问题:这里有一些生成新数据帧dfComb_resample的代码。该数据帧具有扩展的ecuTime变量、从df1df2复制的a, b, c, d的值(在适当的情况下(以及其他任何地方的NA值。(如果我没有达到你想要的目标,请告诉我。(

time = seq(1, 6, by = 0.1)
df1 <- data.frame(ecuTime = c(2, 4, 6), a = as.factor(c("male", "female", 
"male")), b = c(1, 3, 5))
df2 <- data.frame(ecuTime = c(1, 3.2, 3.4, 6), c = as.factor(c("car", "car", 
"bike", "car")), d = c(2, 3, 5, 6))
dfComb_resample <- 
Reduce(function(x, y) merge(x=x, y=y, by = "ecuTime", all = TRUE),
list(data.frame(ecuTime = time), df1, df2))

工作原理:Reduce()是在这种情况下一次合并三个(或更多(数据帧的快捷方式。请注意,如果任何合并的数据帧都有共同的变量,那么您会得到一些意外的行为,而在本例中它们没有。

最新更新