簡體   English   中英

根據其他列的值將列添加到數據框

[英]Add column to Data Frame based on values of other columns

我的數據框DF看起來像:

ID    Name1    Name2    Group    
1234  A1       x
1234  A4       w
1234  A3       q
1234  A        A
1234  A2       z
5678  B3       s
5678  B        B
...

我需要添加一列GroupName1每個ID的匹配ID的行其中Name1 == Name2

因此,邏輯將是檢查Name1 == Name2,記住該行的ID和Name1值,然后對於具有該ID的每一行,將Name1值放在Group列的每一行中。

結果應如下所示:

ID    Name1    Name2    Group    
1234  A1       x        A
1234  A4       w        A
1234  A3       q        A
1234  A        A        A
1234  A2       z        A
5678  B3       s        B
5678  B        B        B
...

我不確定如何在數據框中以及從具有不同ID的許多行中執行此操作。 我不想使用循環。

mutate()lapply()也許嗎?

我可以看到如何在“組”列中為其中Name1 == Name2的行添加Name1值,但是如何將其回滾到所有匹配的ID?

您可以使用data.table在一行中data.table

DT[, Group := Name1[Name1 == Name2], by=ID]

詳細信息:

library(data.table)

DT <- as.data.table(DF)

DT[, Group := Name1[Name1 == Name2], by=ID]

     ID Name1 Name2 Group
1: 1234    A1     x     A
2: 1234    A4     w     A
3: 1234    A3     q     A
4: 1234     A     A     A
5: 1234    A2     z     A
6: 5678    B3     s     B
7: 5678     B     B     B
8: 1589     C     x    NA
9: 1589     C     y    NA



## if `Name1`, `Name2`  are NOT characters, use 
DT[, Name1 := as.character(Name1)]
DT[, Name2 := as.character(Name2)]

試試這個

x <- merge(x, x[x$Name1 == x$Name2, 1:2], by.x = "ID", by.y = "ID")
names(x)[4] <- "Group"
#     ID Name1.x Name2   Group
# 1 1234      A1     x       A
# 2 1234      A4     w       A
# 3 1234      A3     q       A
# 4 1234       A     A       A
# 5 1234      A2     z       A
# 6 5678      B3     s       B
# 7 5678       B     B       B

另一種可能性:

unsplit(lapply(split(df, df$ID), function(x) {
    x$Group <- if(any(y <- x$Name1 %in% x$Name2)) x$Name2[y] else NA
    x
}), df$ID)

     ID Name1 Name2 Group
1  1234    A1     x     A
2  1234    A4     w     A
3  1234    A3     q     A
4  1234     A     A     A
5  1234    A2     z     A
6  5678    B3     s     B
7  5678     B     B     B
9  1589     C     x  <NA>
10 1589     C     y  <NA>

數據

df <- 
structure(list(ID = c("1234", "1234", "1234", "1234", "1234", 
"5678", "5678", "1589", "1589"), Name1 = structure(c(2L, 5L, 
4L, 1L, 3L, 7L, 6L, 8L, 8L), .Label = c("A", "A1", "A2", "A3", 
"A4", "B", "B3", "C"), class = "factor"), Name2 = structure(c(6L, 
5L, 3L, 1L, 7L, 4L, 2L, 6L, 8L), .Label = c("A", "B", "q", "s", 
"w", "x", "z", "y"), class = "factor")), .Names = c("ID", "Name1", 
"Name2"), row.names = c("1", "2", "3", "4", "5", "6", "7", "9", 
"10"), class = "data.frame")

每個ID的Name1Name2之間是否總是存在一個(只有一個)匹配項?

如果是這樣,您可以為此使用dplyr的 mutate (如@Richard Scriven的答案中那樣使用df ):

require(dplyr)

df[1:7,] %>% 
    group_by(ID) %>%
    mutate(Group = Name1[Name1 %in% Name2])

如果每個ID可能有一個匹配項或沒有匹配項,則可以添加ifelse語句來處理不匹配的情況。

df %>% 
    group_by(ID) %>%
    mutate(Group = ifelse(any(Name1 %in% Name2), 
                          as.character(Name1)[Name1 %in% Name2], "NA"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM