我有一个数据框,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
答案 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))