创建新列并使用 r 中的条件计算每个元素
Creat new column and calculate each element with conditions in r
我有一个数据框 (df) 看起来像这样,
a b c
12 14 21
71 23 58
20 33 64
3 22 12
25 55 19
31 14 20
29 20 31
10 10 41
20 37 33
31 99 43
42 24 34
每个元素在此数据框中没有模式。
list<-c(1,3,5)
我当前的密码是
df$d<-NA
for (i in 1:length(list)){
for( j in 1:nrow(df)){
df$d[j]<- df$c[j]- df$b[j+i]
print(mean(df$d, na.rm=TRUE))
}
}
对于"list"中的每个元素,我循环它并计算平均值(df$d),然后让它再次循环,然后再次找到平均值(df$d)。
预期结果:
当 i=1
a b c d
12 14 21 -2 (=21-23)
71 23 58 25 (=58-33)
20 33 64 42
3 22 12 -43
25 55 19 5
31 14 20 0
29 20 31 21
10 10 41 4
20 37 33 -66
31 99 43 19
42 24 34 NA
然后,求第"d"列的均值,也就是(mean(df$d, na.rm=TRUE),也就是5/10rows =0.5,这个mean真的是什么我需要。
当 i=3
a b c d
12 14 21 -1 (=21-22)
71 23 58 3 (=58-55)
20 33 64 50
3 22 12 -8
25 55 19 9
31 14 20 -17
29 20 31 -68
10 10 41 17
20 37 33 NA
31 99 43 NA
42 24 34 NA
然后,求列"d"的平均值,即(mean(df$d, na.rm=TRUE),即-15/8rows =-1.875,这个平均值真的是我需要的。
这段代码非常慢,因为它有两个循环运行,整个数据有50K多行,真正的列表有15个以上的元素,所以需要很长时间。谁能帮我解决一下,非常感谢。
我们可以使用 sapply
遍历 list
中的每个元素。我们使用 dplyr
中的 lead
来获取 b
的前导值并从 c
列中减去它,然后计算它的 mean
删除 NA
值。
library(dplyr)
sapply(list, function(x) mean(df$c - lead(df$b, x), na.rm = T))
#[1] 0.500000 -1.875000 -1.666667
我有一个数据框 (df) 看起来像这样,
a b c
12 14 21
71 23 58
20 33 64
3 22 12
25 55 19
31 14 20
29 20 31
10 10 41
20 37 33
31 99 43
42 24 34
每个元素在此数据框中没有模式。
list<-c(1,3,5)
我当前的密码是
df$d<-NA
for (i in 1:length(list)){
for( j in 1:nrow(df)){
df$d[j]<- df$c[j]- df$b[j+i]
print(mean(df$d, na.rm=TRUE))
}
}
对于"list"中的每个元素,我循环它并计算平均值(df$d),然后让它再次循环,然后再次找到平均值(df$d)。
预期结果:
当 i=1
a b c d
12 14 21 -2 (=21-23)
71 23 58 25 (=58-33)
20 33 64 42
3 22 12 -43
25 55 19 5
31 14 20 0
29 20 31 21
10 10 41 4
20 37 33 -66
31 99 43 19
42 24 34 NA
然后,求第"d"列的均值,也就是(mean(df$d, na.rm=TRUE),也就是5/10rows =0.5,这个mean真的是什么我需要。
当 i=3
a b c d
12 14 21 -1 (=21-22)
71 23 58 3 (=58-55)
20 33 64 50
3 22 12 -8
25 55 19 9
31 14 20 -17
29 20 31 -68
10 10 41 17
20 37 33 NA
31 99 43 NA
42 24 34 NA
然后,求列"d"的平均值,即(mean(df$d, na.rm=TRUE),即-15/8rows =-1.875,这个平均值真的是我需要的。
这段代码非常慢,因为它有两个循环运行,整个数据有50K多行,真正的列表有15个以上的元素,所以需要很长时间。谁能帮我解决一下,非常感谢。
我们可以使用 sapply
遍历 list
中的每个元素。我们使用 dplyr
中的 lead
来获取 b
的前导值并从 c
列中减去它,然后计算它的 mean
删除 NA
值。
library(dplyr)
sapply(list, function(x) mean(df$c - lead(df$b, x), na.rm = T))
#[1] 0.500000 -1.875000 -1.666667