这看起来很简单,但我无法表现。它与声音不同类似的问题here.
我想在数据框df上创建新的列df$col1
,df$col2
,df$col3
,使用列中的条件已经存在,即df$con
和df$val
。
df$col1
df$con > 3
中写下“val”列的值
df$val
df$col2
中写下col df$con<2
的值
df$val
介于1和3之间,我想在df$col3
中写出df$con
的30%。我该怎么办?下面是我的数据帧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")
答案 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
允许您在数据框中创建新列,但您必须记住将其存储在顶部。它存储为output
。 ifelse
允许您有条件地为新列指定值,例如列col1
。 ifelse
中的第二个参数是真实条件的输出,第三个参数是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