R相当于第一个或最后一个sas运算符
有人知道什么是SAS first的最佳替代方案吗。或者最后。接线员?我没有找到 SAS拥有第一个。最后。自动变量,用于识别具有与特定变量相同值的组中的第一条和最后一条记录;因此,在以下数据集中定义了FIRST.model和LAST.model:R相当于第一个或最后一个sas运算符,r,sas,R,Sas,有人知道什么是SAS first的最佳替代方案吗。或者最后。接线员?我没有找到 SAS拥有第一个。最后。自动变量,用于识别具有与特定变量相同值的组中的第一条和最后一条记录;因此,在以下数据集中定义了FIRST.model和LAST.model: Model,SaleID,First.Model,Last.Model Explorer,1,1,0 Explorer,2,0,0 Explorer,3,0,0 Explorer,4,0,1 Civic,5,1,0 Civic,6,0,0 Civic,7
Model,SaleID,First.Model,Last.Model
Explorer,1,1,0
Explorer,2,0,0
Explorer,3,0,0
Explorer,4,0,1
Civic,5,1,0
Civic,6,0,0
Civic,7,0,1
下面的函数基于@Joe对First/Last的描述
该函数返回向量列表
每个列表条目对应于数据帧的列(即数据集的特征或变量)
然后,在一个给定的列表条目中,有一个与之相关的索引 到每个观察类别的第一个(或最后一个)元素 用法示例: 每个物种的观察结果: 抓取整行,以便第一次观察Sepices
函数findFirstList()的代码:
findFirstList听起来你在找!重复
,且fromLast
参数为FALSE
或TRUE
d <- datasets::Puromycin
d$state
# [1] treated treated treated treated treated treated treated
# [8] treated treated treated treated treated untreated untreated
#[15] untreated untreated untreated untreated untreated untreated untreated
#[22] untreated untreated
#Levels: treated untreated
!duplicated(d$state)
# [1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#[13] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
!duplicated(d$state,fromLast=TRUE)
# [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
#[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
d更新(先读取)
如果您真的只对行索引感兴趣,那么可以直接使用split
和range
。以下假设数据集中的行名是按顺序编号的,但也可能进行调整
irisFirstLast <- sapply(split(iris, iris$Species),
function(x) range(as.numeric(rownames(x))))
irisFirstLast ## Just the indices
# setosa versicolor virginica
# [1,] 1 51 101
# [2,] 50 100 150
iris[irisFirstLast[1, ], ] ## `1` would represent "first"
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 51 7.0 3.2 4.7 1.4 versicolor
# 101 6.3 3.3 6.0 2.5 virginica
iris[irisFirstLast, ] ## nothing would represent both first and last
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 50 5.0 3.3 1.4 0.2 setosa
# 51 7.0 3.2 4.7 1.4 versicolor
# 100 5.7 2.8 4.1 1.3 versicolor
# 101 6.3 3.3 6.0 2.5 virginica
# 150 5.9 3.0 5.1 1.8 virginica
d <- datasets::Puromycin
dFirstLast <- sapply(split(d, d$state),
function(x) range(as.numeric(rownames(x))))
dFirstLast
# treated untreated
# [1,] 1 13
# [2,] 12 23
d[dFirstLast[2, ], ] ## `2` would represent `last`
# conc rate state
# 12 1.1 200 treated
# 23 1.1 160 untreated
最后一种方法非常方便。例如,如果您想要每组的前三行和后三行,可以使用:DT[,.SD[c(1:3,(.N-2):.N)],by=Species]
(仅供参考:。N
表示每组的病例数
其他有用的方法包括:
DT[, tail(.SD, 2), by = Species] ## last two rows of each group
DT[, head(.SD, 4), by = Species] ## first four rows of each group
带有n=1选项和by的head-and-tail函数是一种很好的方法。请参见R for SAS和SPss用户**(Robert Muenchen)使用感兴趣的by变量创建数据框架
i、 这是最后一次
dfby<- data.frame(df$var1, df$var2)
mylastList<-by(df,dfby,tail, n=1)
#turn into a dataframe
mylastDF<-do.call(rbind,mylastList)
dfby以下是一个dplyr解决方案:
# input
dataset <- structure(list(Model = structure(c(2L, 2L, 2L, 2L, 1L, 1L, 1L
), .Label = c("Civic", "Explorer"), class = "factor"), SaleID = 1:7), .Names = c("Model",
"SaleID"), class = "data.frame", row.names = c(NA, -7L))
# code
library(dplyr)
dataset %>%
group_by(Model) %>%
mutate(
"First" = row_number() == min( row_number() ),
"Last" = row_number() == max( row_number() )
)
# output:
Model SaleID First Last
<fctr> <int> <lgl> <lgl>
1 Explorer 1 TRUE FALSE
2 Explorer 2 FALSE FALSE
3 Explorer 3 FALSE FALSE
4 Explorer 4 FALSE TRUE
5 Civic 5 TRUE FALSE
6 Civic 6 FALSE FALSE
7 Civic 7 FALSE TRUE
我无法访问SAS-什么是.first或.last?你能添加一个例子吗?first.
和last.
不是运算符;它们是自动SAS数据步长变量,通过
语句处理来指示列值的变化。我不认为。但这个链接似乎有答案。因为我们中没有多少人知道w SAS,如果你能解释你想做什么,它可能会更快地得到答案
,也一样……也许可以将函数定义放在使用它的任何代码之前?@Dason,也许。但是在这种情况下,函数的内部结构不如用法重要。我认为这里的答案实际上只是使用的。我对是如何首先使用的。
和最后使用的理解是设置在by组子集上工作的过程。@mnel从未使用过SAS,有点匆忙地阅读了文章。data.table
选项是我想到的第一件事,因为我最近一直在研究这个包。谢谢你向我指出这一点。我已经更新了一些可能更相关的内容,但仍然不确定e确切地说,在实践中如何使用第一个。
和最后一个。
。
d <- datasets::Puromycin
d$state
# [1] treated treated treated treated treated treated treated
# [8] treated treated treated treated treated untreated untreated
#[15] untreated untreated untreated untreated untreated untreated untreated
#[22] untreated untreated
#Levels: treated untreated
!duplicated(d$state)
# [1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#[13] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
!duplicated(d$state,fromLast=TRUE)
# [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
#[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
irisFirstLast <- sapply(split(iris, iris$Species),
function(x) range(as.numeric(rownames(x))))
irisFirstLast ## Just the indices
# setosa versicolor virginica
# [1,] 1 51 101
# [2,] 50 100 150
iris[irisFirstLast[1, ], ] ## `1` would represent "first"
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 51 7.0 3.2 4.7 1.4 versicolor
# 101 6.3 3.3 6.0 2.5 virginica
iris[irisFirstLast, ] ## nothing would represent both first and last
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 50 5.0 3.3 1.4 0.2 setosa
# 51 7.0 3.2 4.7 1.4 versicolor
# 100 5.7 2.8 4.1 1.3 versicolor
# 101 6.3 3.3 6.0 2.5 virginica
# 150 5.9 3.0 5.1 1.8 virginica
d <- datasets::Puromycin
dFirstLast <- sapply(split(d, d$state),
function(x) range(as.numeric(rownames(x))))
dFirstLast
# treated untreated
# [1,] 1 13
# [2,] 12 23
d[dFirstLast[2, ], ] ## `2` would represent `last`
# conc rate state
# 12 1.1 200 treated
# 23 1.1 160 untreated
datasetFirstLast <- sapply(split(dataset, dataset$groupingvariable),
function(x) c(rownames(x)[1],
rownames(x)[length(rownames(x))]))
library(data.table)
DT <- data.table(iris, key="Species")
DT[J(unique(Species)), mult = "first"]
# Species Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1: setosa 5.1 3.5 1.4 0.2
# 2: versicolor 7.0 3.2 4.7 1.4
# 3: virginica 6.3 3.3 6.0 2.5
DT[J(unique(Species)), mult = "last"]
# Species Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1: setosa 5.0 3.3 1.4 0.2
# 2: versicolor 5.7 2.8 4.1 1.3
# 3: virginica 5.9 3.0 5.1 1.8
DT[, .SD[c(1,.N)], by=Species]
# Species Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1: setosa 5.1 3.5 1.4 0.2
# 2: setosa 5.0 3.3 1.4 0.2
# 3: versicolor 7.0 3.2 4.7 1.4
# 4: versicolor 5.7 2.8 4.1 1.3
# 5: virginica 6.3 3.3 6.0 2.5
# 6: virginica 5.9 3.0 5.1 1.8
DT[, tail(.SD, 2), by = Species] ## last two rows of each group
DT[, head(.SD, 4), by = Species] ## first four rows of each group
dfby<- data.frame(df$var1, df$var2)
mylastList<-by(df,dfby,tail, n=1)
#turn into a dataframe
mylastDF<-do.call(rbind,mylastList)
# input
dataset <- structure(list(Model = structure(c(2L, 2L, 2L, 2L, 1L, 1L, 1L
), .Label = c("Civic", "Explorer"), class = "factor"), SaleID = 1:7), .Names = c("Model",
"SaleID"), class = "data.frame", row.names = c(NA, -7L))
# code
library(dplyr)
dataset %>%
group_by(Model) %>%
mutate(
"First" = row_number() == min( row_number() ),
"Last" = row_number() == max( row_number() )
)
# output:
Model SaleID First Last
<fctr> <int> <lgl> <lgl>
1 Explorer 1 TRUE FALSE
2 Explorer 2 FALSE FALSE
3 Explorer 3 FALSE FALSE
4 Explorer 4 FALSE TRUE
5 Civic 5 TRUE FALSE
6 Civic 6 FALSE FALSE
7 Civic 7 FALSE TRUE
install.packages("dplyr")