在 R 上:我有一個 150 000 obs 的資料集。645 個變數。我需要通過公式轉換資料集(645 列)的所有負值。有些列是字串,但大多數變數是數字。如:如果值為正,則保持不變,如果為負,我想應用此公式 (值 *-1)/2
我的資料集名稱是 sed_lac_qc:我試過這個:
if (sed_lac_qc<0 {sed_lac_qc=((sed_lac_qc*-1)/2)} else {sed_lac_qc=sed_lac_qc}
但這會導致此錯誤:警告訊息:在 if (sed_lac_qc < 0) { 中:條件長度 > 1 并且僅使用第一個元素
uj5u.com熱心網友回復:
假設我們有一個資料框,其中每一列都是數字。例如假設資料框BOD2,在最后的注釋中定義,基于R自帶的BOD資料框。
1) lapply然后對每一列執行創建列串列的操作并將其轉換回資料框。我們可以用任何其他函式替換指定的函式,只要它表示在 R 中向量化的操作。
不使用任何包。
as.data.frame(lapply(BOD2, function(x) ifelse(x > 0, x, -x/2)))
給予:
Time demand
1 0.5 8.3
2 0.5 10.3
3 3.0 19.0
4 4.0 16.0
5 5.0 15.6
6 7.0 19.8
如果有非數字列,則使用:
as.data.frame(lapply(BOD2, function(x) {
if (is.numeric(x)) ifelse(x > 0, x, -x/2) else x
}))
2) pmax或者,對于這個特定的變換,我們可以使用 pmax 給出相同的結果。
pmax(BOD2, -BOD2/2)
或者如果有非數字列那么
is_num <- sapply(BOD2, is.numeric)
BOD3 <- BOD2[is_num]
replace(BOD2, is_num, pmax(BOD3, -BOD3/2))
3) dplyr使用 dplyr 我們可以這樣做:
library(dplyr)
BOD2 %>% mutate(across(where(is.numeric), ~ ifelse(. > 0, ., -./2)))
4)collapse我們可以使用collapse 包中的ftransformv:
library(collapse)
ftransformv(BOD2, is.numeric, function(x) ifelse(x > 0, x, -x/2))
筆記
BOD2 <- BOD
BOD2[1:2, 1] <- -1
所以 BOD2 看起來像這樣:
Time demand
1 -1 8.3
2 -1 10.3
3 3 19.0
4 4 16.0
5 5 15.6
uj5u.com熱心網友回復:
因為你有一個完整的資料框作為數字。只需對其進行數學計算:
sg <- df > 0
df1 <- df^sg * (-df/2)^(1-sg)
另一種選擇是使用 ifelse:
data.frame(ifelse(df > 0, df, -df/2))
uj5u.com熱心網友回復:
正如您所提到的,您想從資料集中找出負值,然后想通過公式轉換負值。如果您分享了您嘗試解決此問題的代碼,那么我們將清楚您達到了哪個級別。此外,我正在為您提供解決此問題的簡單方法。
if(value < 0){
value = (value *-1)/2
}else{
value = value
}
或嘗試 ifelse
ifelse(test, yes, no)
喜歡:
ifelse(sed_lac_qc<0, (sed_lac_qc*-1)/2, sed_lac_qc)
嘗試檢查您的值是否小于 0,如果小于 0,則應用您的公式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/359741.html
