R 通过因子计算结果在列表中-如何规避?

R 通过因子计算结果在列表中-如何规避?,r,R,我有一个data.frame,如下所示: Lot Wafer Voltage Slope Voltage_irradiated Slope_irradiated m_dist_lot 1 8 810 356.119 6.08423 356.427 6.13945 NA 2 8 818 355.249 6.01046 354.124 6.20855 NA 3 9 917

我有一个data.frame,如下所示:

  Lot Wafer Voltage Slope Voltage_irradiated Slope_irradiated m_dist_lot
1   8   810   356.119 6.08423    356.427           6.13945          NA
2   8   818   355.249 6.01046    354.124           6.20855          NA
3   9   917   346.921 6.21474    346.847           6.33904          NA
4 (...)
120 9   914   353.335 6.15060    352.540           6.19277          NA 
121 7   721   358.647 6.10592    357.797           6.17244          NA
122 (...)
我的目标很简单,但也有点困难。显然,可以通过以下几种方式解决此问题: 我想根据一个系数对每一行应用一个函数“func”,例如系数“Lot”。这是通过

m_dist_lot<- by(data.frame, data.frame$Lot,func)
第一行似乎是获取数据的初始data.frame的行。第二行是计算值。 我现在的问题是:如何根据正确的行将这些值正确地存储到origin data.frame中

例如,在数据帧的某一计算/行的情况下:

m_dist_lot<- by(data.frame, data.frame$Lot,func)
我想将值4.6459868存储在数据中。根据正确的行“2”帧$m_dist_lot:

但我不知道怎么做。实际上,我最好的尝试是使用“unlist”


un我在以下人员的帮助下找到了解决办法:


un如果没有可复制的数据或您希望
func
做什么的示例,我在这里猜测一下。然而,我认为
dplyr
将是您的答案

首先,我将使用
dplyr
(从
magrittr
导出)中的管道(
%%>%%
)通过一系列函数传递内置的
iris
数据。如果您试图计算的内容需要完整的data.frame(而不仅仅是一列或两列),那么您可以修改此方法以执行您想要的操作(只需编写函数以获取data.frame,添加感兴趣的列,然后返回完整的data.frame)

这里,我首先将
iris
数据按物种进行拆分(这将创建一个列表,每个物种都有一个单独的data.frame)。接下来,我使用
lappy
在列表的每个元素上运行函数
head
。这将返回data.frames的列表,现在每个都只有三行。(你可以在这里用你感兴趣的函数替换
head
,只要它返回完整的data.frame。)最后,我用
bind_行将列表中的每个元素重新缝合在一起

topIris <-
  iris %>%
  split(.$Species) %>%
  lapply(head, n = 3) %>%
  bind_rows()
我将用它来说明我认为能够解决你潜在问题的方法

来自
dplyr
groupby
函数允许类似的方法,但无需
拆分
数据帧。对data.frame进行分组时,应用于它的所有函数将按组单独应用。下面是一个实际的例子,它对每个物种的萼片长度进行排序。这显然不是非常有用,但您可以编写一个自定义函数,该函数将任意数量的列作为参数(然后作为向量传入),并返回相同长度的向量(以创建新列或更新现有列)。最后的
select
功能只是为了更容易看到我做了什么

topIris %>%
  group_by(Species) %>%
  mutate(rank_Sepal_Length = rank(Sepal.Length)) %>%
  select(Species, rank_Sepal_Length, Sepal.Length)
返回:

     Species rank_Sepal_Length Sepal.Length
      <fctr>             <dbl>        <dbl>
1     setosa                 3          5.1
2     setosa                 2          4.9
3     setosa                 1          4.7
4 versicolor                 3          7.0
5 versicolor                 1          6.4
6 versicolor                 2          6.9
7  virginica                 2          6.3
8  virginica                 1          5.8
9  virginica                 3          7.1
种级萼片长度萼片长度
1刚毛3 5.1
2刚毛2 4.9
3刚毛1 4.7
4彩色3 7.0
5彩色16.4
6彩色2 6.9
7弗吉尼亚州26.3
8弗吉尼亚州15.8
9弗吉尼亚州37.1
un[1]
6.354 
3.523125 
un[2]
6.355 
9.422959 
un[3]
(..)
un[1]
3.523125
un[2]
9.422959
un[3]
1.49965
(..)
(...)
7.922    0.94130936
7.976    4.89560441
8.1      2.14153516
8.2      4.64598677
8.11     1.34855514
(...)
un<- do.call(rbind, lapply(list, data.frame, stringsAsFactors=FALSE))
un<- gsub(".*.","", un)
un<- regmatches(un, gregexpr("(?<=.).*", un, perl=TRUE))

rows<- data.frame(matrix(ncol = 1, nrow = lengths(un)))
colnames(rows)<- c("row_number")
rows["row_number"]<- sprintf("%s", rownames(un))
rows["row_number"]<- as.numeric(un[,1])
rows["row_number"]<- sub("^[^.]*[.]", "", format(rows[,1], width = max(nchar(rows[,1]))))
topIris <-
  iris %>%
  split(.$Species) %>%
  lapply(head, n = 3) %>%
  bind_rows()
  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1          5.1         3.5          1.4         0.2     setosa
2          4.9         3.0          1.4         0.2     setosa
3          4.7         3.2          1.3         0.2     setosa
4          7.0         3.2          4.7         1.4 versicolor
5          6.4         3.2          4.5         1.5 versicolor
6          6.9         3.1          4.9         1.5 versicolor
7          6.3         3.3          6.0         2.5  virginica
8          5.8         2.7          5.1         1.9  virginica
9          7.1         3.0          5.9         2.1  virginica
topIris %>%
  group_by(Species) %>%
  mutate(rank_Sepal_Length = rank(Sepal.Length)) %>%
  select(Species, rank_Sepal_Length, Sepal.Length)
     Species rank_Sepal_Length Sepal.Length
      <fctr>             <dbl>        <dbl>
1     setosa                 3          5.1
2     setosa                 2          4.9
3     setosa                 1          4.7
4 versicolor                 3          7.0
5 versicolor                 1          6.4
6 versicolor                 2          6.9
7  virginica                 2          6.3
8  virginica                 1          5.8
9  virginica                 3          7.1