簡體   English   中英

在 R 中的數據幀上使用 approx 保留類型因子的列

[英]keep columns of type factor using approx on a data frame in R

我有一個很大的 dataframe 有很多列。 其中一些是 double 類型,另一些是類型因子。 我通過添加一個新列“時間”與大約 function 和方法 =“常量”來重新采樣 dataframe。 之后,所有因子列都更改為雙精度列。

例如:

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))

即使我大約使用 function,是否可以將因子列保持為因子,並將類型為 double 的列保持為兩倍?

編輯:我發現在因子上使用大約 function 並不想使用 na.rm = TRUE 是沒有意義的,因為我在某些列中有很多 NA,如果我用以前的值替換它們與分布等方面的原始數據有很大的不同。是否有替代解決方案只為非因子列執行大約 function,然后將其與原始因子列合並? 我認為不使用先前值填充因子列並僅使用與重新采樣時間相關的原始值(如 0.1、0.2 等)是有意義的。之后可以合並它。

我只是很困惑如何將 df1 和 df2 與重新采樣的時間頻率結合起來,所以我的分布和線圖與原始數據完全不同。 我想要實現的最終目標是在特定時間范圍內對一些特定因素進行一些比較。 所以我無法比較不同的變量,因為另一個變量可能是 NA。

因此,我不清楚您要在這里完成什么,這很好; 我很好地理解了具體問題。 但是,我相信您真的非常確定這是一個好主意 - 從表面上看,我非常擔心通過approx() function 對因子變量的基礎整數進行類似算術運算(這完全沒有意義)。 在我看來,可能有一種“更好”(即不那么老套)的方式來完成這項工作,但我不會在 position 中幫助您做到這一點,因為您的總體目標對我來說並不明確。

也就是說,這是一條可能的道路 map 使用base R 做你想做的事:

  • 確定哪些變量應該是因素
  • 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變量, a, b, c, d值從df1df2復制(如果適用),以及其他任何地方的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()是在這種情況下一次合並三個(或更多)數據幀的快捷方式。 請注意,如果任何合並的數據框有共同的變量,您會得到一些意想不到的行為,而在本示例中它們沒有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM