1

我经常遇到在多个 data.frames 上执行特定任务的问题。这是我的工作示例 data.frame,它是从文本文件中导入的。

 cellID         X          Y Area    AVGFP DeviationGFP   AvgRFP DeviationsRFP Slice GUI.ID
1       1  18.20775  26.309859  568 5.389085     7.803248 12.13028      5.569880     0      1
2       2  39.78755   9.505495  546 5.260073     6.638375 17.44505     17.220153     0      1
3       3  30.50000  28.250000    4 6.000000     4.000000  8.50000      1.914854     0      1
4       4  38.20233 132.338521  257 3.206226     5.124264 14.04669      4.318130     0      1
5       5  43.22467  35.092511  454 6.744493     9.028574 11.49119      5.186897     0      1
6       6  57.06534 130.355114  352 3.781250     5.713022 20.96591     14.303546     0      1
7       7  86.81765  15.123529 1020 6.043137     8.022179 16.36471     19.194279     0      1
8       8  75.81932 132.146417  321 3.666667     5.852172 99.47040     55.234726     0      1
9       9 110.54277  36.339233  678 4.159292     6.689660 12.65782      4.264624     0      1
10     10 127.83480  11.384886  569 4.637961     6.992881 11.39192      4.287963     0      1

正如我之前发布的问题,这些数据帧中有 40 个名为 slice1...slice40。

我想要做的是在每个包含 AVGFP 和 Area 的产品的 data.frames 中添加一个新列。我可以通过使用轻松地在一个 data.frame 上执行此操作

stats[[1]]$totalGFP <- stats[[1]]$AVGFP * stats[[1]]$Area

我一直试图将此命令应用于 stats 中的每个 data.frame

我感谢任何和所有的帮助。为了帮助您在发布解决方案时继续前进,您能否描述用于帮助我跟进的命令的详细信息,谢谢!

4

2 回答 2

1

像这样:

stats <- lapply(stats, transform, totalGFP = AVGFP * Area)

我会尽力解释,但请参阅?lapply完整?transform文档。

transform是根据作为参数传递的类型的公式将列添加到 data.frame 的totalGFP = AVGFP * Area函数。例如,要将totalGFP列添加到您的第一个 data.frame,您可以运行transform(stats[[1]], totalGFP = AVGFP * Area).

lapply将函数(此处transform)应用于列表或向量(此处)的每个元素stats,并返回一个列表。如果要应用的函数需要更多参数,它们可以在lapply调用结束时传递,这里是totalGFP = AVGFP * Area. 因此,这lapply是一种transformstats.

于 2013-09-29T21:17:40.760 回答
1

鉴于你写了“请描述命令的细节”,试试这个简单的例子:

# create two small data frames
df1 <- data.frame(AVGFP = 1:3, Area = 4:6)
df2 <- data.frame(AVGFP = 7:9, Area = 1:3)

# create a list with named objects: the two data frames.
# ?list: "The arguments to list [...] of the form [...] tag = value
ll <- list(df1 = df1, df2 = df2)
str(ll)

# apply a function on each element in the list
# each element is a single data frame
# Use an 'anonymous function', function(x), where 'x' corresponds to each single data frame
# The function does this:
# (1) calculate the new variable 'total', and (2) add it to the data frame 
ll2 <- lapply(X = ll, FUN = function(x){
  total <- x$AVGFP * x$Area
  x <- data.frame(x, total)
  })

# check ll2
str(ll2)
于 2013-09-29T21:20:43.863 回答