假设我有这样的数据:
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 1https://stackoverflow.com/questions/64935397
复制相似问题