我想根据行中的值在我的data.frame中创建一个新列。
如果'键入"不等于" a",my" new.area"列应包含来自" area"的数据。类型" a"。这适用于多个"距离"。
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
),其中每个&#34;距离&#34;在行中,将有&#34; area&#34;的值。类型&#34; a&#34;。
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
但如何自动制作?
答案 0 :(得分:4)
以下是使用索引子集([
)和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$
。
答案 1 :(得分:2)
我们可以使用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