簡體   English   中英

從 R 中的數字列向量創建因子

[英]Creating a factor from a numeric column vector in R

我在df有一個權重數字列( df$weight0 )。 我想創建一個新列df$weight1 ,它是一個基於df$weight0值的factor

如果df$weight0值小於等於170,則df$weight1對應的值為1,如果df$weight0中的值大於170,則df$weight1對應的值為2。

下面的代碼是我嘗試過的,但它給出了一個單一的值而不是一個向量。

  if (i<=170){
    i==1
  }else{
    i==2
  }
}

ifelse可以使用矢量化輸入:

df$weight1 <- ifelse(df$weight0<=170,1,2)

您正在檢查 i 的值,而不是 df 中的值。 此外,您的新列的分配也沒有實現。 請嘗試以下操作。

for (i in wcgs$weight0){
  if (wcgs$weight0[i]<=170){
    wcgs$weight1[i] <- 1
  }else{
    wcgs$weight1[i] <- 2
  }
}

使用cut()按區間離散化連續變量

對於這種區間分類,有一個非常有用的函數cut

nums <- nums <- runif(100, min=0, max=300) # n = 100 random numbers between 0 and 300
factorized_num <- cut(nums, c(-Inf, 170, +Inf))
# you can name the categories as you want:
levels(factorized_num) <- c(1, 2) # first interval 1, next interval 2
# with include.lowest=TRUE or FALSE you can determine whether lower limit is <= or <

或者使用Vectorize()對非矢量化函數進行矢量化

# define for one case:
categorize <- function(i) if (i<=170) 1 else 2
# then vectorize it:
categorize <- Vectorize(categorize)

現在你可以使用它:

categories <- categorize(nums)
head(categories) ## 1 2 1 1 ...

我更喜歡這個 - 根據我的經驗 - 比ifelse()更喜歡這個,因為你可以完全控制單個案例。

使用case_when從包

library(dplyr)
df %>% mutate(df$weight1 = case_when(df$weight0 =< 170 ~ 1,
                                     df$weight0 > 170 ~ 2)) 

case_when()有助於制定if-else構造和mutate()修改或添加列。

暫無
暫無

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

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