我有一个这样的 Dataframe :
df = read.table(text="ID L1 L2 L3 L4 L5 L6 L7 L8 S1 S2 S3 S4 S5 S6 S7 S8
T1 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2
T2 0 0 0 0 0 0 0 0 0 1 2 2 2 2 2 2
T3 0 0 0 0 0 0 0 0 0 1 2 2 2 2 2 2
T4 0 0 0 1 0 0 0 0 0 1 2 2 1 1 1 1
T5 0 0 0 0 0 0 0 0 0 1 2 2 2 2 2 2
T6 0 0 0 0 0 0 0 0 0 1 2 2 2 2 2 2
T7 0 0 0 0 0 0 0 0 0 1 2 2 2 2 2 2
T8 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0
T9 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2", header=T, stringsAsFactors=F)
我想在两个有列的子集中分别按行计数“0”、“1”和“2”:grep(“^L”,names(df))或grep(“^S”,names(df))。然后用两个子集中的最大值数创建两个新列。结果是这样的:
ID L S
T1 0 2
T2 0 2
T3 0 2
T4 0 1
T5 0 2
T6 0 2
T7 0 2
T8 0 0
T9 0 2
感谢任何帮助!
4条答案
按热度按时间s71maibg1#
对我来说,最简单的方法是将数据旋转得更长,将所有
S
和L
值分别放在一列中。然后,您可以按ID
进行分组,并在组内找到L
和S
的模态值。我做了一个叫做“modal”的小函数来查找模态值。创建于2023-09-11使用reprex v2.0.2
2cmtqfgy2#
带有
aggregate
+reshape
的基本R选项这给
xtupzzrd3#
您可以一次对整个部分执行
table
,而不是逐行执行。这样应该更快使用具有10k行的数据框进行基准测试。
hmtdttj44#
对于每个
ID
,c_across
将向用户定义的函数mode
传递一个数字向量,该函数将返回该向量中最常出现的数字。输出