![](/img/trans.png)
[英]Q-How to fill a new column in data.frame based on row values by two conditions in R
[英]R: fill new columns in data.frame based on row values by condition?
我想根据行中的值在data.frame中创建一个新列。
如果“类型”不等于“ a”,则我的“ new.area”列应包含来自“ a”类型的“ area”的数据,这是针对多个“距离”的。
Example:
# create data frame
distance<-rep(seq(1,5, by = 1),2)
area<-c(11:20)
type<-rep(c("a","b"),each = 5)
# check data.frame
(my.df<-data.frame(distance, area, type))
distance area type
1 1 11 a
2 2 12 a
3 3 13 a
4 4 14 a
5 5 15 a
6 1 16 b
7 2 17 b
8 3 18 b
9 4 19 b
10 5 20 b
我想创建一个新列( my.df$new.area
),其中对于行中的每个“距离”,将存在类型为“ a”的“ area”值。
distance area type new.area
1 1 11 a 11
2 2 12 a 12
3 3 13 a 13
4 4 14 a 14
5 5 15 a 15
6 1 16 b 11
7 2 17 b 12
8 3 18 b 13
9 4 19 b 14
10 5 20 b 15
我知道如何手动进行单行操作:
my.df$new.area[my.df$distance == 1 ] <- 11
但是如何使其自动进行呢?
这是使用索引子集( [
)和match
的基本R解决方案:
my.df$new.area <- with(my.df, area[type == "a"][match(distance, distance[type == "a"])])
哪个返回
my.df
distance area type new.area
1 1 11 a 11
2 2 12 a 12
3 3 13 a 13
4 4 14 a 14
5 5 15 a 15
6 1 16 b 11
7 2 17 b 12
8 3 18 b 13
9 4 19 b 14
10 5 20 b 15
area[type == "a"]
提供可能性的向量。 match
用于通过距离变量从此向量返回索引。 with
可以避免重复使用my.df$
。
我们可以使用data.table
library(data.table)
setDT(my.df)[, new.area := area[type=="a"] , distance]
my.df
# distance area type new.area
# 1: 1 11 a 11
# 2: 2 12 a 12
# 3: 3 13 a 13
# 4: 4 14 a 14
# 5: 5 15 a 15
# 6: 1 16 b 11
# 7: 2 17 b 12
# 8: 3 18 b 13
# 9: 4 19 b 14
#10: 5 20 b 15
或者我们可以按顺序使用距离的数字索引
with(my.df, area[type=="a"][distance])
#[1] 11 12 13 14 15 11 12 13 14 15
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.