我在这个网站上经历了许多有条件的变异问题,但我的问题比那些更复杂。这是我的数据结构:复杂的条件变异
d = matrix(data = NA, ncol = 3, nrow = 9)
d = as.data.frame(d)
colnames(d) = c('group', 'type', 'v1')
d$group = c(1,1,1,2,2,2,2,2,2)
d$type = c(1,2,3,1,2,3,3,3,3)
d$v1 = c(43,21,234,5,56,6,56,4,345)
group type v1
1 1 43
1 2 21
1 3 234
2 1 5
2 2 56
2 3 6
2 3 56
2 3 4
2 3 345
它有两个分组变量:group
和type
。我需要创建一个新的变量v2
,使:
- 每组
,如果
type == 1
,v2 = 1
- 每组
,如果
type == 2
,v2 = [v1(type2) - v1(type1)]/[v1(type2) + v1(type1)]
。例如,在组1中,当type == 2
,v2 = (21-43)/(21 + 43)
- 每组
,如果
type == 3
,应用相同的功能v2 = [v1(type3) - v1(type1)]/[v1(type3) + v1(type1)]
。例如,在1组,当type == 3
,v2 = (234 - 43)/(234 + 43)
我的数据集有超过200组。在每组中,类型3的频率也不同。
这里就是我所做的: 我创建公式的函数:
flsm = function(x, y){(x - y)/(x + y)}
然后我尝试计算v2
:
d %>% group_by(group) %>%
mutate(v2 = ifelse(type == 2,
flsm(v1, type == 1[v1])),
ifelse(type == 3, flsm(v1, type == 1[v1])), 1)
它返回以下警告:
Error: argument "no" is missing, with no default
In addition: Warning messages:
1: In is.na(e1) | is.na(e2) :
longer object length is not a multiple of shorter object length
2: In `==.default`(c(1L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), 1[c(6.27, :longer object length is not a multiple of shorter object length
我觉得我没有从正确的方法。任何想法如何计算v2
?
看起来你每次调用'flsm'后都有一个额外的括号。它应该是mutate(lsm = ifelse(type == 2,flsm(v1,type == 1 [v1]), ifelse(type == 3,flsm(v1,type == 1 [v1]),1 )'。我不知道这是唯一的问题,但看看是否修复你的代码。 – eipi10