假设我有这样的数据:
data_a <- data.frame(
"Node_A" = c("John", "John", "John", "Peter", "Peter", "Peter", "Tim", "Kevin", "Adam", "Adam", "Xavier"),
"Node_B" = c("Claude", "Peter", "Tim", "Tim", "Claude", "Henry", "Kevin", "Claude", "Tim", "Henry", "Claude")
)
food <- data.frame(
"Person" = c("John", "Peter", "Tim", "Kevin", "Adam", "Xavier", "Claude", "Henry"),
"Favorite_Food" = c("pizza", "pizza", "tacos", "pizza", "ice cream", "sushi", "sushi", "pizza")
)
我想在"data_a“文件中创建一个名为”公共“的新列。对于给定的行,如果两个人有相同的"Favorite_Food“(”食物“),那么”公共“的值将是"1”,否则"0“。
我不知道如何开始解决这个问题。
我试图创建以下逻辑:
data_a$common = ifelse(c(data_a$Node_A, food$Person, food$Favorite_Food) = c(data_a$Node_B, food$Person, food$Favorite_Food)), data_a$common = "1", "0")
但我不确定这是否正确。
有人能告诉我怎么做吗?谢谢
发布于 2020-11-20 19:19:08
这是一个基本的R解。它使用match
两次为每个人获取食物,然后比较每一行的两种食物。
i <- match(data_a$Node_A, food$Person)
j <- match(data_a$Node_B, food$Person)
data_a$common <- as.integer(food$Favorite_Food[i] == food$Favorite_Food[j])
data_a
# Node_A Node_B common
#1 John Claude 0
#2 John Peter 1
#3 John Tim 0
#4 Peter Tim 0
#5 Peter Claude 0
#6 Peter Henry 1
#7 Tim Kevin 0
#8 Kevin Claude 0
#9 Adam Tim 0
#10 Adam Henry 0
#11 Xavier Claude 1
最后清理一下。
rm(i, j)
发布于 2020-11-20 19:20:54
如果您确实想在match
中使用ifelse
,可以尝试以下方法。
使用match(data_a$Node_A, food$Person)
本身将为您提供food$Person
中第一个匹配的Node_A
名称的索引或位置(Node_A
是要匹配的值,food$Person
是要匹配的值):
[1] 1 1 1 2 2 2 3 4 5 5 6
例如,Node_A
中的第四个人是Peter,这里的结果向量中的第四个元素是2,所以food
中的第二行将是Peter (比萨)想要的食物。
通过获取match
结果并将其包含在food$Favorite_Food
(如food$Favorite_Food[2]
)中,您将在第二行中为Peter获得相应的最喜欢的食物。
同样的事情可以做NodeB
和比较。
data_a$common <- ifelse(
food$Favorite_Food[match(data_a$Node_A, food$Person)] ==
food$Favorite_Food[match(data_a$Node_B, food$Person)], 1, 0)
输出
Node_A Node_B common
1 John Claude 0
2 John Peter 1
3 John Tim 0
4 Peter Tim 0
5 Peter Claude 0
6 Peter Henry 1
7 Tim Kevin 0
8 Kevin Claude 0
9 Adam Tim 0
10 Adam Henry 0
11 Xavier Claude 1
https://stackoverflow.com/questions/64935397
复制相似问题