[英]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
從包dplyr :
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.