为多个数据框列表计算新属性并将其展开

6

我希望你能在R中帮助我解决问题。 我有以下数据框:

df1

a,b,c,d

1,2,3,4

1,2,3,4

1,2,3,4

df2

a,b,c,d

1,2,3,4

1,2,3,4

1,2,3,4

1,2,3,4

我需要对每个数据帧执行以下操作。
 df1$value <- 0.12*df1$a+0.24*df1$b+0.56*df1$c

根据另一篇Stack Overflow答案的建议,建议列出所有数据帧。我试图使用以下语句来实现。它可以正常工作。

df_list <- list(ls(pattern='df*'))

现在我无法使用lapply计算以下代码中的新属性

res <- lapply(dflist, function(x) {
          0.12*grep(x[[a]])+0.24*grep(x[[b]])+0.56*grep(x[[c]]))
          })

在执行上述操作后,我希望能够重新组织我的数据框,但不使用列表。


最好将数据框保留在列表中。你为什么需要 grep(x[[a]])(顺便说一下,这也是不正确的)?难道不应该是 0.12*x[[a]] + 0.24*x[[b]] + 0.56 * x[[c]] 吗? - akrun
忘记引号了,即 x[['a']] - akrun
2个回答

2

R中,最好将data.frame存储在list中。如果我们真的需要更新全局环境中的data.frame对象,请在使用带有'value'列的'df_list'进行transform后,使用list2env

df_list <- mget(ls(pattern='df\\d+'))
res <- lapply(df_list, transform, value = 0.12*a + 0.24*b + 0.56*c)
list2env(res, envir = .GlobalEnv)
df1
#  a b c d value
#1 1 2 3 4  2.28
#2 1 2 3 4  2.28
#3 1 2 3 4  2.28
 df2
#  a b c d value
#1 1 2 3 4  2.28
#2 1 2 3 4  2.28
#3 1 2 3 4  2.28
#4 1 2 3 4  2.28

我们使用mget获取字符串(ls(pattern='df\\d+')))的值,并将其存储在一个list中,然后循环遍历data.framelist(lapply(df_list, ...),使用transform在每个data.frame中创建一个新列'value',最后使用list2env更新全局环境中的对象。

数据

df1 <- structure(list(a = c(1L, 1L, 1L), b = c(2L, 2L, 2L), c = c(3L, 
3L, 3L), d = c(4L, 4L, 4L)), .Names = c("a", "b", "c", "d"),
 class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(a = c(1L, 1L, 1L, 1L), b = c(2L, 2L, 2L, 2L), 
c = c(3L, 3L, 3L, 3L), d = c(4L, 4L, 4L, 4L)), .Names = c("a", 
"b", "c", "d"), row.names = c(NA, -4L), class = "data.frame")

嗨,Akrun,非常感谢您的回复。我在脚本“res <- lapply(df_list, transform, value = 0.12a + 0.24b + 0.56*c)”中遇到了对象a未找到的问题。 - Naveen Srikanth
@NaveenSrikanth 我创建了两个对象'df1'和'df2'(更新了'data')并运行了代码。对我来说它是有效的。 - akrun
1
Akrun,非常感谢。我已经为此苦苦挣扎了三天。现在我的问题是我在列表中放了两个NULL数据框,所以它没有起作用。我真的很感激你。它起作用了。 - Naveen Srikanth

2

以下是使用矩阵乘法的解决方案:

df1 <- read.table(header=TRUE, sep=",", text=
"a,b,c,d
1,2,3,4
1,2,3,4
1,2,3,4")

df2 <- read.table(header=TRUE, sep=",", text=
"a,b,c,d
1,2,3,4
1,2,3,4
1,2,3,4
1,2,3,4")

df1$value <- as.matrix(df1) %*% c(0.12, 0.24, 0.56, 0)
df1
df2$value <- as.matrix(df2) %*% c(0.12, 0.24, 0.56, 0)
df2

或者

df1$value <- as.matrix(df1[1:3]) %*% c( 0.12, 0.24, 0.56)
df2$value <- as.matrix(df2[1:3]) %*% c( 0.12, 0.24, 0.56)

要处理数据框列表,您可以执行以下操作:

L <- list(df1, df2)
lapply(L, function(x) transform(x, value=as.matrix(x[1:3]) %*% c( 0.12, 0.24, 0.56)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接