2017-08-01 127 views
-1

我有一个数据帧DF这样的:从另一个变量分配值?

>VAR1   VAR2 
>38   230 
>78   300 
>125   600 
>173   
>221 
>271 
>323 
>375 
>429 
>484 
>547 
>610 

,我想分配中无功2的值在瓦尔1的值之间,从而在VAR2的值比在VAR1的值小(但大于上述值)。因此,DF有看起来某事像这样:

>VAR1   VAR2 
>38   
>78   
>125   
>173   
>221 
>271   230 
>323   300 
>375 
>429 
>484 
>547   
>610   600 

我已经试过“的”功能全,但后来我不得不手动分配值。这当然是一种选择,但是由于我必须用几个df来做这个,所以我认为可能有这个功能。任何帮助真的很感激。

+0

对不起NA值,我忘了..是我在这里的第一篇文章.. – Xiaoxin

回答

1

我假设你的空行会在R.

library(dplyr) 

# example of dataset 
dt = data.frame(Var1 = c(173,221,271,323,375,429,610), 
       Var2 = c(230,300,600,NA,NA,NA,NA)) 

# function that gets the minimum value above a given value x 
f = function(x) { min(dt$Var1[dt$Var1 > x]) } 
f = Vectorize(f) 

# get pairs of Var1 and Var2 values 
dt_pairs = data.frame(Var2 = dt$Var2) %>% # keep only Var2 column as a dataframe 
    filter(!is.na(Var2)) %>%     # filter out NAs 
    mutate(Var1 = f(Var2))     # for each Var2 value get the corresponding value from Var1 

# see how the pairs look 
dt_pairs 

# Var2 Var1 
# 1 230 271 
# 2 300 323 
# 3 600 610 


dt %>% 
    select(Var1) %>%       # select only Var1 
    left_join(dt_pairs, by="Var1")   # join the Var2 values 

# Var1 Var2 
# 1 173 NA 
# 2 221 NA 
# 3 271 230 
# 4 323 300 
# 5 375 NA 
# 6 429 NA 
# 7 610 600 
+0

哇,我的数据出色it.worked。非常感谢! – Xiaoxin