我有下面提到的数据:
注意:我在dataframe中有大约20万行,并且希望在dataframe中运行逻辑。
ID Num MAX CH
1 22 A XCA-1
2 24 B VBS-1
3 54 A XCA-1
4 48 A XCA-1
5 88 C CXV-1
6 87 B VBS-1
7 98 A VBS-0如何检查每个MAX值,我们在整个数据格式中都有相同的CH,并添加一个状态(即匹配或不匹配)的新列。
所需数据:
ID Num MAX CH ST
1 22 A XCA-1 Not Match
2 24 B VBS-7 Match
3 54 A XCA-1 Not Match
4 48 A XCA-1 Not Match
5 88 C CXV-4 Match
6 87 B VBS-7 Match
7 98 A VBS-0 Not Match发布于 2018-02-14 10:08:22
我们可以使用data.table。按“MAX”分组后,获取“CH”作为逻辑向量的唯一数目,以填充“不匹配”、“匹配”,并将其分配给“ST2”以创建列
library(data.table)
setDT(df1)[, ST2 := c("Not Match", "Match")[(uniqueN(CH) == 1) + 1], MAX]
df1
# ID Num MAX CH ST2
#1: 1 22 A XCA-1 Not Match
#2: 2 24 B VBS-1 Match
#3: 3 54 A XCA-1 Not Match
#4: 4 48 A XCA-1 Not Match
#5: 5 88 C CXV-1 Match
#6: 6 87 B VBS-1 Match
#7: 7 98 A VBS-0 Not Match发布于 2018-02-14 09:54:59
如果我理解正确,你可以这样做:
transform(df, ST2 = ave(as.character(CH), MAX, FUN = function(x)
if(length(unique(x)) == 1) "Match" else "Not Match" ))
# ID Num MAX CH ST ST2
#1 1 22 A XCA-1 Not Match Not Match
#2 2 24 B VBS-7 Match Match
#3 3 54 A XCA-1 Not Match Not Match
#4 4 48 A XCA-1 Not Match Not Match
#5 5 88 C CXV-4 Match Match
#6 6 87 B VBS-7 Match Match
#7 7 98 A VBS-0 Not Match Not Match发布于 2018-02-14 09:54:49
我相信您有一个类别( MAX列),对于MAX中的每个条目,您希望确定该类别是否具有列CH的唯一值。这一点没有反映在你目前发布的例子中,但似乎是你所说的。如果这是您想要的,那么可以很容易地使用group_by()策略来完成:
library(tidyverse)
df <- data.frame(ID = 1:6,
MAX = c("A", "B", "A", "A", "C", "B"),
CH = c("A", "B", "A", "A", "C", "D"))在这里,我创建了一个数据框架,当MAX == A或C时,CH的值总是相同的,但是当它等于B时,结果是:
df <- df %>% group_by(MAX) %>%
mutate(Match = ifelse(length(unique(CH))==1, "Match", "No Match"))
df
# A tibble: 6 x 4
# Groups: MAX [3]
ID MAX CH Match
<int> <fct> <fct> <chr>
1 1 A A Match
2 2 B B No Match
3 3 A A Match
4 4 A A Match
5 5 C C Match
6 6 B D No Matchhttps://stackoverflow.com/questions/48783651
复制相似问题