如何使用if条件创建新列

时间:2014-11-03 00:05:08

标签: r if-statement conditional calculated-columns

这看起来很简单,但我无法表现。它与声音不同类似的问题here. 我想在数据框df上创建新的列df$col1df$col2df$col3,使用列中的条件已经存在,即df$condf$val

  1. 如果df$col1
  2. ,我想在df$con > 3中写下“val”列的值
  3. 如果df$val
  4. ,我想在df$col2中写下col df$con<2的值
  5. 如果df$val介于1和3之间,我想在df$col3中写出df$con的30%。
  6. 我该怎么办?下面是我的数据帧df,条件为“con”两列,值为“val”。

    dput(df)
    structure(list(con = c(-33.09524956, -36.120924, -28.7020053, 
    -26.06385399, -18.45731163, -14.51817928, -20.1005132, -23.62346403, 
    -24.90464018, -23.51471516), val = c(0.016808197, 1.821442227, 
     4.078385886, 3.763593573, 2.617612605, 2.691796601, 1.060565469, 
     0.416400183, 0.348732675, 1.185505136)), .Names = c("con", "val"
     ), row.names = c(NA, 10L), class = "data.frame")
    

2 个答案:

答案 0 :(得分:1)

这可能会这样做。首先,我们编写一个函数来将FALSE值更改为NA

foo <- function(x) {
    is.na(x) <- x == FALSE
    return(x)
}

然后将其应用于逻辑向量列表并获取匹配的val列值

df[paste0("col", 1:3)] <- with(df, {
    x <- list(con > 3, con < 2, con < 3 & con > 1)
    lapply(x, function(y) val[foo(y)])
})

导致

df
         con       val col1      col2 col3
1  -33.09525 0.0168082   NA 0.0168082   NA
2  -36.12092 1.8214422   NA 1.8214422   NA
3  -28.70201 4.0783859   NA 4.0783859   NA
4  -26.06385 3.7635936   NA 3.7635936   NA
5  -18.45731 2.6176126   NA 2.6176126   NA
6  -14.51818 2.6917966   NA 2.6917966   NA
7  -20.10051 1.0605655   NA 1.0605655   NA
8  -23.62346 0.4164002   NA 0.4164002   NA
9  -24.90464 0.3487327   NA 0.3487327   NA
10 -23.51472 1.1855051   NA 1.1855051   NA

答案 1 :(得分:0)

可以采用整齐的方式。管道%>%只是将每个操作的输出发送到下一个函数。 mutate允许您在数据框中创建新列,但您必须记住将其存储在顶部。它存储为outputifelse允许您有条件地为新列指定值,例如列col1ifelse中的第二个参数是真实条件的输出,第三个参数是ifelse为假时的输出。希望这也有所帮助!

去tidyverse!

 library(tidyverse)

 output <- df %>%
   mutate(col1=ifelse(con>3, val, NA)) %>%
   mutate(col2=ifelse(con<2, val, NA)) %>%
   mutate(col3=ifelse(con<=3 & con>=1, 0.3*val, NA))

这是一个实际符合某些条件的df

structure(list(con = c(-33.09524956, 2.5, -28.7020053, 2, -18.45731163, 
2, -20.1005132, 6, -24.90464018, -23.51471516), val = c(0.016808197, 
1.821442227, 4.078385886, 3.763593573, 2.617612605, 2.691796601, 
1.060565469, 0.416400183, 0.348732675, 1.185505136)), .Names = c("con", 
"val"), row.names = c(NA, 10L), class = "data.frame")

这是运行代码后的output

         con       val      col1      col2      col3
1  -33.09525 0.0168082        NA 0.0168082        NA
2    2.50000 1.8214422        NA        NA 0.5464327
3  -28.70201 4.0783859        NA 4.0783859        NA
4    2.00000 3.7635936        NA        NA 1.1290781
5  -18.45731 2.6176126        NA 2.6176126        NA
6    2.00000 2.6917966        NA        NA 0.8075390
7  -20.10051 1.0605655        NA 1.0605655        NA
8    6.00000 0.4164002 0.4164002        NA        NA
9  -24.90464 0.3487327        NA 0.3487327        NA
10 -23.51472 1.1855051        NA 1.1855051        NA