繁体   English   中英

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

[英]R: fill new columns in data.frame based on row values by condition?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM