2016-12-09 11 views
1

私の行の値に基づいて、data.frameに新しい列を作成したいとします。R:条件によって行の値に基づいてdata.frameの新しい列を埋める?

「タイプは、A」と等しくない 『場合』、私の 『new.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 

私は列内のすべての「距離」のために、タイプ「A」の「面積」の値が存在することになる新しい列(my.df$new.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 

私はこれを手動で作成する方法を知っています1行の場合:

my.df$new.area[my.df$distance == 1 ] <- 11 

しかし、自動的に作成する方法は?ここ

答えて

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$の繰り返し使用を避けるために使用されます。

+0

クールとして、我々は、距離の数値インデックスを使用することができますを使用することができ、あなたに多くのことを感謝! ;) – maycca

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 
関連する問題