R:如何根据其他列中的序列和值获取数据框列中的值

时间:2015-12-07 06:51:27

标签: r

我有一个数据框,df。我按v1和v2排序的数据帧。 对于v1中的每组唯一值(样本数据中的值1,2和3),我想计算一个新变量v5。

v5的值取决于v3和v4的值: 如果v3 ==“New”则v5 == v4。 如果v3 ==“Old”,则v5在v3中第一个前面的值等于“New”的行中获得v4的值。全部在v1的同一“组”中。

示例数据:

df <- data.frame(v1=c(1,1,1,2,2,2,3,3,3,3), 
             v2=c(1,2,3,1,2,3,1,2,3,4),
             v3=c("New", "Old", "Old","New", "Old", "New","New", "New", "Old","Old"),
             v4=c("A","B","C","X","Y","Z","A","B","C","D")) 


v1 v2  v3 v4
1  1 New  A  
1  2 Old  B
1  3 Old  C
2  1 New  X
2  2 Old  Y
2  3 New  Z
3  1 New  A
3  2 New  B
3  3 Old  C
3  4 Old  D

期望的输出:

   v1 v2  v3 v4 v5
    1  1 New  A  A
    1  2 Old  B  A
    1  3 Old  C  A
    2  1 New  X  X
    2  2 Old  Y  X
    2  3 New  Z  Z
    3  1 New  A  A
    3  2 New  B  B
    3  3 Old  C  B
    3  4 Old  D  B

2 个答案:

答案 0 :(得分:2)

也可以使用function setData(ctrl) { var r = confirm("continue?"); if (r == true) { // clicked Radio button gets checked } else { // perviously checked button remains checked event.preventDefault(); return false; } } 包。

dplyr

答案 1 :(得分:1)

我们可以尝试使用data.table。将'data.frame'转换为'data.table'(setDT(df)),按'v1'分组,我们replace'v4'元素对应'v3'中的'Old'值NA然后使用na.locf(来自library(zoo))将NA值替换为前面的非NA值,分配(:=)输出以创建新列' V5' 。

library(data.table)
library(zoo)
setDT(df)[, v5:= na.locf(replace(v4, v3=='Old', NA)) , by = v1]
df
#    v1 v2  v3 v4 v5
# 1:  1  1 New  A  A
# 2:  1  2 Old  B  A
# 3:  1  3 Old  C  A
# 4:  2  1 New  X  X
# 5:  2  2 Old  Y  X
# 6:  2  3 New  Z  Z
# 7:  3  1 New  A  A
# 8:  3  2 New  B  B
# 9:  3  3 Old  C  B
#10:  3  4 Old  D  B

或者我们可以使用ave

中的base R
df$v5 <- with(df, ave(replace(v4, v3=='Old', NA),v1, FUN= na.locf))