簡體   English   中英

重新編碼R中的值

[英]Recode values in R

如果x> 1但<2,我想重新編碼一列中的值,它將重新編碼為1

這是我的代碼:

neu$b <- lapply(neu$swl.y, function(x) ifelse(x>1 & x<=2, 1, x))

那里有錯嗎?

 swl.y

  2.2
  1.2
  3.4
  5.6

我實際上需要重新編碼所有值:

  neu$c <- with(neu, ifelse(swl.y>1 & swl.y <=2, 1, swl.y))
  neu$c <- with(neu, ifelse(swl.y>2 & swl.y <=3, 2, swl.y))
  neu$c <- with(neu, ifelse(swl.y>3 & swl.y <=4, 3, swl.y))
  neu$c <- with(neu, ifelse(swl.y>4 & swl.y <=5, 4, swl.y))
  neu$c <- with(neu, ifelse(swl.y>5 & swl.y <=6, 5, swl.y))
  neu$c <- with(neu, ifelse(swl.y>6 & swl.y <=7, 6, swl.y))

我想我知道問題出在哪里。 當R運行第二行代碼時,重新編碼的值恢復為先前的值。

我們不需要為單個列循環。 通過使用lapply(neu$swl.y ,我們可以將列中的每個元素用作list元素,而我們可能不需要這些元素ifelse函數是矢量化的,可以通過邏輯將其直接用於列“ swl.y” OP的帖子中提到的情況。

 neu$b <- with(neu, ifelse(swl.y>1 & swl.y <=2, 1, swl.y))

否則,我們將“ b”列創建為“ swl.y”,並根據邏輯條件更改“ b”的值。

 neu$b <- neu$swl.y
 neu$b[with(neu, swl.y>1 & swl.y <=2)] <- 1

為了更好地理解OP代碼的問題,我們可以檢查lapply的輸出

 lapply(neu$swl.y, function(x) x) #similar to `as.list(neu$swl.y)`
 #[[1]]
 #[1] 3

 #[[2]]
 #[1] 0

 #[[3]]
 #[1] 0

 #[[4]]
 #[1] 2

 #[[5]]
 #[1] 1

輸出是一個list ,其中列的每個元素都作為list元素。 在列表上使用ifelse可能不是最佳方法,因為它已經過矢量化處理(如上所述)。 但是,假設我們是否使用ifelse

lapply(neu$swl.y, function(x) ifelse(x>1 & x<=2, 1, x))
#[[1]]
#[1] 3

#[[2]]
#[1] 0

#[[3]]
#[1] 0

#[[4]]
#[1] 1

#[[5]]
#[1] 1

可以將data.frame視為具有相同長度列表元素的list 因此,基於上面的輸出,這應該是一個5列1行的data.frame。 通過單列“ b”,我們創建了一個包含5個列表元素的list列。

 neu$b <- lapply(neu$swl.y, function(x) ifelse(x>1 & x<=2, 1, x))
 str(neu)
 #'data.frame': 5 obs. of  2 variables:
 #$ swl.y: int  3 0 0 2 1
 #$ b    :List of 5
 # ..$ : int 3
 # ..$ : int 0
 # ..$ : int 0
 # ..$ : num 1
 # ..$ : int 1

但是,這不是我們想要的。 有什么補救辦法? 一種方法是使用sapply/vapply而不是lapply ,因為長度相同, lapply將返回vector輸出,或者我們不unlist lapply輸出以創建vector

 neu$b <- sapply(neu$swl.y, function(x) ifelse(x>1 & x<=2, 1, x))
 str(neu) 
 #'data.frame': 5 obs. of  2 variables:
 # $ swl.y: int  3 0 0 2 1
 # $ b    : num  3 0 0 1 1

更新資料

根據OP的編輯過的帖子,如果我們需要多次重新編碼,請使用cutfindInterval cut ,我們可以指定breaks ,還有其他參數labels可以返回默認標簽。

 with(neu1, cut(swl.y, breaks=c(-Inf,1,2,3,4,5,6,Inf), labels=F)-1)
 #[1] 2 1 3 5

數據

set.seed(48)
neu <- data.frame(swl.y=sample(0:5, 5, replace=TRUE))

#newdata 
neu1 <- structure(list(swl.y = c(2.2, 1.2, 3.4, 5.6)), 
.Names = "swl.y", class = "data.frame", row.names = c(NA, -4L))

暫無
暫無

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

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