R:根据条件按行值填充data.frame中的新列?

时间:2016-12-09 14:19:40

标签: r

我想根据行中的值在我的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

但如何自动制作?

2 个答案:

答案 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