下面是一个使用data.table的选项。我们将“data.frame”转换为“data.table”(setDT(DF))。按“用户”列分组,我们选择除第一行之外的所有行(tail(.SD, -1))其中.SD是Subset of Data.table。但是,如果“User”组只有一行,则也会删除该行。我们可以通过使用if/else条件来避免这种情况,该条件声明if的行数大于1(.N>1),则我们移除第一列或else,传回第一列(.SD)。
library(data.table)
setDT(DF)[, if(.N>1) tail(.SD,-1) else .SD , by = User]
# User No
#1: A 2
#2: A 3
#3: A 4
#4: B 2
#5: C 1
#6: D 1
3条答案
按热度按时间wf82jlnq1#
如果我没理解错的话,这应该可以
字符串
duplicated()
会告诉你一个值是否已经被看到过,但是它在第一次看到一个值时返回“0”(它还没有被复制),然后在每次看到这个值时返回“TRUE”。为了不删除只有一行的值,我们也保留了每组总行数n()
为1的值。vbopmzt12#
下面是一个使用
data.table
的选项。我们将“data.frame”转换为“data.table”(setDT(DF)
)。按“用户”列分组,我们选择除第一行之外的所有行(tail(.SD, -1)
)其中.SD
是Subset of Data.table
。但是,如果“User”组只有一行,则也会删除该行。我们可以通过使用if/else
条件来避免这种情况,该条件声明if
的行数大于1(.N>1
),则我们移除第一列或else
,传回第一列(.SD
)。字符串
或者,@MrFlick的dplyr代码中的类似选项将使用逻辑条件
duplicated
和.N
(行数)。我们通过检查具有单个观察的“用户”组来创建列“N(.N==1
),则在下一步骤,我们对N为TRUE或'User'为duplicated
的数据列建立子集。duplicated
会传回duplicate
个数据列的TRUE
值,并留下第一个值表示为FALSE
。型
或者,
base R
选项会使用ave
来取得逻辑索引('indx 2'),方法是检查每个'User'群组的length
是否为1。我们可以使用此沿着duplicated
(如上所述)来设定数据集的子集。型
4si2a6ki3#
这不像MrFlick和akrun的方法那么容易理解,但它是一个基于R的单行解决方案
字符串
它给
型
说明:
型
logicalA
.选择所有重复的条目,因此,忽略所有只有一个条目的用户logicalB
...选择所有只有一个条目的用户,并选择最后一个条目(参见fromLast=TRUE
)的多行用户(后者由logicalA选择)我希望我做对了:)