[英]add column values based on other columns in data frame using for and if
[英]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
...
我需要添加一列Group
是Name1
每個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的Name1
和Name2
之間是否總是存在一個(只有一個)匹配項?
如果是這樣,您可以為此使用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.