从另一个数据框中选择具有相同功能的元素?

时间:2017-03-03 22:02:23

标签: r dataframe permutation

我在r中有一个数据帧,我将其子集化为两个:

p<-c(3.14,3.56,7.45,8.33,5.44,3.12,3.78,7.62,9.12,4.34,6.78,8.65,6.99)
n<-c("mQTL","mQTL","null","null","null","null","null","null","null","null","null","null","null")
s<-c(2,2,1,2,1,1,2,2,2,1,2,1,2)
g<-c("female","male","female","male","female","female","male","female","female","male","female","female","female")
df<-data.frame(n,g,s,p)
df


mQTL<-subset(df,df$n=='mQTL')

mQTL

   n      g   s   p
1 mQTL female 2 3.14
2 mQTL   male 2 3.56


null<-subset(df,df$n=="null")

  n      g     s    p
3  null female 1 7.45
4  null   male 2 8.33
5  null female 1 5.44
6  null female 1 3.12
7  null   male 2 3.78
8  null female 2 7.62
9  null female 2 9.12
10 null   male 1 4.34
11 null female 2 6.78
12 null female 1 8.65
13 null female 2 6.99

我想从null中随机搜索两个元素,其中每个元素都匹配基于性别(df $ g)和数字(df $ s)的两个mQTL

例如,我希望第一次随机抽取

这样的东西
 n   g      s   p
null female  2  7.62
null  male   2  3.78

进行第二次随机抽签

  n   g      s   p
null female  2  9.12
null  male   2  3.78

我想随机抽取5次,例如,获得5种不同的组合

我试过

null[which((mQTL$g==null$g)& (mQTL$s==null$s)),]

但它给了我一个数据框,所有这些数据框不是每个组合两个

      n      g s    p
4  null   male 2 8.33
9  null female 2 9.12
11 null female 2 6.78
13 null female 2 6.99

2 个答案:

答案 0 :(得分:0)

尝试使用merge()功能:

merge(mQTL, null, by.x = c("g","s"), by.y = c("g","s)) 

但您可能希望重命名列以使事情更清晰。

答案 1 :(得分:0)

function geo_lat_long($address) {
    $address1 = str_replace(" ","+",$address);
    $address1 = str_replace("&","%26",$address1);
    $json = file_get_contents("http://maps.google.com/maps/api/geocode/json?address=$address1");
    $json = json_decode($json);
    $lat = $json->{'results'}[0]->{'geometry'}->{'location'}->{'lat'};
    $long = $json->{'results'}[0]->{'geometry'}->{'location'}->{'lng'};
    return array('lat' => $lat, 'long' => $long);
}

要绘制5次,您运行for循环并在列表中存储绘图:

mQTL = subset(df,df$n=='mQTL')
null = subset(df,df$n=='null')

# Check if the combination of null$g and null$s matches with that of mQTL$g and mQTL$s
null$match = paste(null$g, null$s) %in% paste(mQTL$g, mQTL$s)

# Random sample of two of the matched rows
null[sample(which(null$match), 2),]

# > null[sample(which(null$match), 2),]
#       n      g s    p match
# 13 null female 2 6.99  TRUE
# 4  null   male 2 8.33  TRUE