R 使用uniques字符对数据帧进行子集设置和重新格式化

R 使用uniques字符对数据帧进行子集设置和重新格式化,r,R,我如何使用以下条件重新格式化和子集数据帧 a) 行名唯一(df1$Name),b)每个名称的每个唯一ID的唯一(df1$ID)ad colnames,c)值。注意:如果一个唯一的名称有重复的ID,请仅为那些频率最高的ID选择值 df1我们可以使用dcast在过滤掉组“Name”、“ID”中“频率”最高的行后,将“long”转换为“wide”setDT将data.frame转换为data.table,其中.max获取组中具有最大“频率”的行的数字索引(by=list(Name,ID))。我们根据索

我如何使用以下条件重新格式化和子集数据帧 a) 行名唯一(df1$Name),b)每个名称的每个唯一ID的唯一(df1$ID)ad colnames,c)值。注意:如果一个唯一的名称有重复的ID,请仅为那些频率最高的ID选择值


df1我们可以使用
dcast
在过滤掉组“Name”、“ID”中“频率”最高的行后,将“long”转换为“wide”
setDT
data.frame
转换为
data.table
其中.max
获取组中具有最大“频率”的行的数字索引(
by=list(Name,ID)
)。我们根据索引(
.SD
-
数据子集.table
)对数据集进行子集,然后使用
dcast

library(data.table)#v.1.9.5+
dcast(setDT(df1)[, .SD[which.max(Frequency)], by = list(Name, ID)], 
                            Name~ID, value.var='value', fill=0)
#    Name A-1 A-2 A-3 A-4 A-5
#1:   AA   0   1   1   1   1
#2:   BB   1   1   0   0   0
#3:   CC   1   0   1   0   0
或者我们可以在
dplyr/tidyr
中使用类似的方法,在分组后使用
slice
过滤掉最大频率行,然后使用
spread
将格式从“long”更改为“wide”

library(dplyr)
library(tidyr)
 df1 %>% 
    group_by(Name, ID) %>%
    slice(which.max(Frequency)) %>% 
    select(-Frequency) %>% 
    spread(ID, value, fill=0)
注意:两个
排列
dcast
都有
填充
选项。默认情况下,它是
NA

数据
df1
library(data.table)#v.1.9.5+
dcast(setDT(df1)[, .SD[which.max(Frequency)], by = list(Name, ID)], 
                            Name~ID, value.var='value', fill=0)
#    Name A-1 A-2 A-3 A-4 A-5
#1:   AA   0   1   1   1   1
#2:   BB   1   1   0   0   0
#3:   CC   1   0   1   0   0
library(dplyr)
library(tidyr)
 df1 %>% 
    group_by(Name, ID) %>%
    slice(which.max(Frequency)) %>% 
    select(-Frequency) %>% 
    spread(ID, value, fill=0)
df1 <- structure(list(Name = c("AA", "AA", "AA", "AA", "AA", "AA", 
"AA", 
"BB", "BB", "BB", "BB", "BB", "BB", "BB", "CC", "CC", "CC", "CC", 
"CC"), ID = c("A-1", "A-2", "A-3", "A-3", "A-1", "A-4", "A-5", 
"A-1", "A-1", "A-2", "A-3", "A-4", "A-4", "A-2", "A-1", "A-2", 
"A-3", "A-3", "A-1"), value = c(0L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 
1L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L), Frequency = c(50L, 
30L, 10L, 60L, 10L, 40L, 50L, 10L, 30L, 20L, 10L, 40L, 60L, 10L, 
10L, 20L, 10L, 15L, 17L)), .Names = c("Name", "ID", "value", 
"Frequency"), class = "data.frame", row.names = c(NA, -19L))