Dataframe 从R中的数字列向量创建因子

Dataframe 从R中的数字列向量创建因子,dataframe,r,for-loop,factors,dplyr,Dataframe,R,For Loop,Factors,Dplyr,我在df中有一个权重的数字列(df$weight0)。我想创建一个新列df$weight1,它是一个基于df$weight0中的值的因子 如果df$weight0中的值小于或等于170,则df$weight1中的相应值应为1,但如果df$weight0中的值大于170,则df$weight1中的相应值应为2 下面的代码是我尝试过的,但它给出的是单个值,而不是向量 if (i<=170){ i==1 }else{ i==2 } } if(iifelse可以使用矢

我在
df
中有一个权重的数字列(
df$weight0
)。我想创建一个新列
df$weight1
,它是一个基于
df$weight0
中的值的
因子

如果
df$weight0
中的值小于或等于170,则
df$weight1
中的相应值应为1,但如果
df$weight0
中的值大于170,则
df$weight1
中的相应值应为2

下面的代码是我尝试过的,但它给出的是单个值,而不是向量

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

if(i
ifelse
可以使用矢量化输入:

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

df$weight1
ifelse
可以使用矢量化输入:

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

df$weight1您检查的是i的值,而不是df中的值。此外,未实现新列的赋值。请尝试以下操作

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

如果(wcgs$weight0[i]您检查的是i的值,而不是df中的值。此外,未实现新列的赋值。请尝试以下操作

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

如果(wcgs$weight0[i]使用软件包中的
case\u时:

库(dplyr)
当(df$weight0=<170~1,
df$权重0>170~2)

case\u-when()
有助于制定
if-else
构造和
mutate()
修改或添加列。

使用包中的
case\u-when

库(dplyr)
当(df$weight0=<170~1,
df$权重0>170~2)
case\u when()
有助于制定
if else
构造和
mutate()
修改或添加列。

使用
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 <
现在您可以使用它:

categories <- categorize(nums)
head(categories) ## 1 2 1 1 ...
类别使用
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 <
现在您可以使用它:

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

categories
df$weight1 170)+1
df$weight1 170)+1
谢谢大家。我尝试了切割方法
wcgs$w8tnice!最好是你包括/命名所有限制(如果没有限制,
-Inf
+Inf
因此很有用)。谢谢大家。我尝试过使用cut方法
wcgs$w8tnice!最好是包含/命名所有限制(如果没有限制,
-Inf
+Inf
因此非常有用)。谢谢。因此我使用wcgs$weight1[I]更改该索引的值。因此,我使用wcgs$weight1[I]更改该索引的值