将 apply 与使用行中特定位置的匿名函数一起使用
using apply with an anonymous function which uses specific locations in the row
我有一个包含 10000 行和 14 个变量的数据框 (data2):
treat rep dist time0 time10 N2O10 WC Temp
1 AGP 1 0 10:09:00 10:19:00 0.2270316 12 17.1
time20 N2O20 N2O0 t0 t10 t20
1 10:31:00 0.3479662 0.2395295 0 0.1666667 0.3666667
我想进行线性回归并获取数据框中每一行的斜率,其中 x 是 t0、t10 和 t20,y 是 N2O0、N2O10 和 N2O20。
就像数据框中一行的这个例子:
data3<-data2[1,]
with (data3, lm(c(N2O0,N2O10,N2O20)~c(t0,t10,t20)))
当我试图在 "apply" 中将上述函数用作匿名函数时,我收到一条错误消息。
data4<-apply(data2, 1, function(data2) lm(c(data2$N2O0,data2$N2O10,data2$N2O20)~c(data2$t0,data2$t10,data2$t20))$coefficients[2])
Error in eval(substitute(expr), data, enclos = parent.frame()) :
invalid 'envir' argument of type 'character'
我不知道这是什么意思,很高兴收到有关如何更正此行的任何建议。
我建议:
- 在开始时对感兴趣的列进行子集化。
- 在您的
apply
中创建一个 list
。
- 运行
lm
在该列表上。
尝试:
apply(data2[c("N2O0","N2O10","N2O20", "t0","t10","t20")], 1, function(x) {
temp <- as.list(x)
lm(c(N2O0, N2O10, N2O20) ~ c(t0, t10, t20), data = temp)$coefficients[2]
})
# 1
# 0.3059211
你 运行 陷入这个问题的部分原因是当你使用 apply
时,由于 "treat"、"time0",所有值都变成了字符"time10" 和 "time20" 列。
比较:
> apply(data2, 1, function(data2) sum(data2[1]))
Error in sum(data2[1]) : invalid 'type' (character) of argument
> apply(data2[-c(1, 4, 5, 9)], 1, function(data2) sum(data2[1]))
1
1
示例数据:
data2 <- structure(list(treat = "AGP", rep = 1L, dist = 0L, time0 = "10:09:00",
time10 = "10:19:00", N2O10 = 0.2270316, WC = 12L, Temp = 17.1,
time20 = "10:31:00", N2O20 = 0.3479662, N2O0 = 0.2395295,
t0 = 0L, t10 = 0.1666667, t20 = 0.3666667), .Names = c("treat",
"rep", "dist", "time0", "time10", "N2O10", "WC", "Temp", "time20",
"N2O20", "N2O0", "t0", "t10", "t20"), row.names = "1", class = "data.frame")
我有一个包含 10000 行和 14 个变量的数据框 (data2):
treat rep dist time0 time10 N2O10 WC Temp
1 AGP 1 0 10:09:00 10:19:00 0.2270316 12 17.1
time20 N2O20 N2O0 t0 t10 t20
1 10:31:00 0.3479662 0.2395295 0 0.1666667 0.3666667
我想进行线性回归并获取数据框中每一行的斜率,其中 x 是 t0、t10 和 t20,y 是 N2O0、N2O10 和 N2O20。 就像数据框中一行的这个例子:
data3<-data2[1,]
with (data3, lm(c(N2O0,N2O10,N2O20)~c(t0,t10,t20)))
当我试图在 "apply" 中将上述函数用作匿名函数时,我收到一条错误消息。
data4<-apply(data2, 1, function(data2) lm(c(data2$N2O0,data2$N2O10,data2$N2O20)~c(data2$t0,data2$t10,data2$t20))$coefficients[2])
Error in eval(substitute(expr), data, enclos = parent.frame()) :
invalid 'envir' argument of type 'character'
我不知道这是什么意思,很高兴收到有关如何更正此行的任何建议。
我建议:
- 在开始时对感兴趣的列进行子集化。
- 在您的
apply
中创建一个list
。 - 运行
lm
在该列表上。
尝试:
apply(data2[c("N2O0","N2O10","N2O20", "t0","t10","t20")], 1, function(x) {
temp <- as.list(x)
lm(c(N2O0, N2O10, N2O20) ~ c(t0, t10, t20), data = temp)$coefficients[2]
})
# 1
# 0.3059211
你 运行 陷入这个问题的部分原因是当你使用 apply
时,由于 "treat"、"time0",所有值都变成了字符"time10" 和 "time20" 列。
比较:
> apply(data2, 1, function(data2) sum(data2[1]))
Error in sum(data2[1]) : invalid 'type' (character) of argument
> apply(data2[-c(1, 4, 5, 9)], 1, function(data2) sum(data2[1]))
1
1
示例数据:
data2 <- structure(list(treat = "AGP", rep = 1L, dist = 0L, time0 = "10:09:00",
time10 = "10:19:00", N2O10 = 0.2270316, WC = 12L, Temp = 17.1,
time20 = "10:31:00", N2O20 = 0.3479662, N2O0 = 0.2395295,
t0 = 0L, t10 = 0.1666667, t20 = 0.3666667), .Names = c("treat",
"rep", "dist", "time0", "time10", "N2O10", "WC", "Temp", "time20",
"N2O20", "N2O0", "t0", "t10", "t20"), row.names = "1", class = "data.frame")