如何获取R中两列之间的公共值?
以Dataframe为例:如何获取R中两列之间的公共值?,r,R,以Dataframe为例: df <- data.frame(x = c("A,B,C","A,D","B,C,E","C,E,G"), y = c("A","D","A",NA), MyAim = c("A","D","","")) x y MyAim 1 A,B,C A A 2 A,D D D 3 B,C,E A 4 C,E,G <NA>
df <- data.frame(x = c("A,B,C","A,D","B,C,E","C,E,G"),
y = c("A","D","A",NA),
MyAim = c("A","D","",""))
x y MyAim
1 A,B,C A A
2 A,D D D
3 B,C,E A
4 C,E,G <NA>
我想在新列中获得x和y列之间的公共值。
提前感谢。如果x是字符,那么以下是执行此操作的多种方法之一:
intersect(unlist(strsplit(df$x, split=",")), df$y)
如果x不是字符,则strsplit将崩溃,因此需要执行以下操作:
intersect(unlist(strsplit(as.character(df$x), split=",")), df$y)
要将其添加到数据框中
myAim <- intersect(unlist(strsplit(as.character(df$x), split=",")), df$y)
df$myAim <- c(myAim, rep(NA, nrow(df)-length(myAim)))
df
x y myAim
1 A,B,C A A
2 A,D D D
3 B,C,E A <NA>
4 C,E,G <NA> <NA>
注:
如果y包含x中的值,则myAim的长度可能高于数据帧的行数。在这种情况下,将结果添加到数据帧似乎不合适。如果x是字符,则以下是执行此操作的多种方法之一:
intersect(unlist(strsplit(df$x, split=",")), df$y)
如果x不是字符,则strsplit将崩溃,因此需要执行以下操作:
intersect(unlist(strsplit(as.character(df$x), split=",")), df$y)
要将其添加到数据框中
myAim <- intersect(unlist(strsplit(as.character(df$x), split=",")), df$y)
df$myAim <- c(myAim, rep(NA, nrow(df)-length(myAim)))
df
x y myAim
1 A,B,C A A
2 A,D D D
3 B,C,E A <NA>
4 C,E,G <NA> <NA>
注:
如果y包含x中的值,则myAim的长度可能高于数据帧的行数。在这种情况下,将结果添加到数据帧似乎不合适。strsplit可以很容易地用于强制使用字符的应用程序,请重试
df <- transform(df, MyAim=apply(df, 1, function(x) {
s <- el(strsplit(x[1], ","))
s[match(x[2], s)]
}))
df
# x y MyAim
# 1 A,B,C A A
# 2 A,D D D
# 3 B,C,E A <NA>
# 4 C,E,G <NA> <NA>
strsplit可以很容易地用于强制字符try的应用程序
df <- transform(df, MyAim=apply(df, 1, function(x) {
s <- el(strsplit(x[1], ","))
s[match(x[2], s)]
}))
df
# x y MyAim
# 1 A,B,C A A
# 2 A,D D D
# 3 B,C,E A <NA>
# 4 C,E,G <NA> <NA>
我们可以使用mapply:
资料
我们可以使用mapply:
资料
出于几个原因,这样做并不明智,但我还是会修改我的答案^_^出于几个原因,这样做并不明智,但我还是会修改我的答案^_^如果Z列有多个公共值,我们应该怎么做?或者,例如df$y[1]是A,B@Ronak@nerdakgul也可以使用y并从函数中获取逗号分隔的值。更新了答案。如果Z列有多个公共值,我们该怎么办?或者,例如df$y[1]是A,B@Ronak@nerdakgul也可以使用y并从函数中获取逗号分隔的值。更新了答案。?el-我一天的新功能。?el-我一天的新功能。