R 通过因子计算结果在列表中-如何规避?
我有一个data.frame,如下所示: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
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