R:根据一列值在另一列中的存在生成虚拟变量
R: Generate a dummy variable based on the existence of one column' value in another column
我有这样一个数据框:
A B
2012,2013,2014 2011
2012,2013,2014 2012
2012,2013,2014 2013
2012,2013,2014 2014
2012,2013,2014 2015
我想创建一个虚拟变量,它表示B列中的值是否存在于A列中。1表示存在,0表示不存在。这样,
A B dummy
2012,2013,2014 2011 0
2012,2013,2014 2012 1
2012,2013,2014 2013 1
2012,2013,2014 2014 1
2012,2013,2014 2015 0
我已经尝试使用 %in%
来实现这个:
df$dummy <- ifelse(df$B %in% df$A, 1, 0)
但结果dummy
栏中的所有内容都是1
。
当我尝试使用另一种方法时发生了同样的情况any()
:
df$dummy <- any(df$A==df$B)
dummy
列中的所有内容都是 TRUE
。
有没有一种有效的方法来生成这个虚拟变量?
非常感谢!
看起来 A
列是一串用逗号分隔的数字,因此 %in%
不合适(例如,如果您检查 B
在多个字符串的向量中,如果 A
和 B
是数字,则为数字)。如果您的数据框架结构不同,请告诉我(并随时编辑您的问题)。
您可能可以通过多种方式完成此操作。也许一种简单的方法是一次使用 grepl
一行来确定列 B
是否存在于 A
中。
library(tidyverse)
df %>%
rowwise() %>%
mutate(dummy = +grepl(B, A))
输出
# A tibble: 5 x 3
A B dummy
<fct> <fct> <int>
1 2012,2013,2014 2011 0
2 2012,2013,2014 2012 1
3 2012,2013,2014 2013 1
4 2012,2013,2014 2014 1
5 2012,2013,2014 2015 0
数据
df <- data.frame(
A = c(rep("2012,2013,2014", 5)),
B = c("2011", "2012", "2013", "2014", "2015")
)
如果你想使用 base R:
df <- data.frame(A = rep("2012,2013,2014", 5), B = c("2011", "2012","2013","2014","2015"))
for(i in 1:nrow(df)){
df$dummy[i] <- grepl(df$B[i],df$A[i])
}
制作制表符分隔文件:
A B
2012,2013,2014 2011
2012,2013,2014 2012
2012,2013,2014 2013
2012,2013,2014 2014
2012,2013,2014 2015
这是使用 stringr 中的 str_detect
的方法:
read.table('test.txt', header = TRUE) %>%
mutate(
B = as.character(B),
dummy = case_when(
str_detect(pattern = B, fixed(A)) ~ '1',
TRUE ~ '0'
)
)
这是另一个使用 tidyverse
的解决方案。主要问题是 A
被读取为字符串。我的解决方案首先将每个数字分成不同的列,然后将 B
与这些数字进行比较。
library(tidyverse)
df %>%
#Separate A into separate numbers
separate(col = A,
sep = ",",
into = c("S1","S2","S3")) %>%
#Compare B to the new columns and fill dummy
mutate(dummy = ifelse(B %in% c(S1,S2,S3), 1, 0))
我有这样一个数据框:
A B
2012,2013,2014 2011
2012,2013,2014 2012
2012,2013,2014 2013
2012,2013,2014 2014
2012,2013,2014 2015
我想创建一个虚拟变量,它表示B列中的值是否存在于A列中。1表示存在,0表示不存在。这样,
A B dummy
2012,2013,2014 2011 0
2012,2013,2014 2012 1
2012,2013,2014 2013 1
2012,2013,2014 2014 1
2012,2013,2014 2015 0
我已经尝试使用 %in%
来实现这个:
df$dummy <- ifelse(df$B %in% df$A, 1, 0)
但结果dummy
栏中的所有内容都是1
。
当我尝试使用另一种方法时发生了同样的情况any()
:
df$dummy <- any(df$A==df$B)
dummy
列中的所有内容都是 TRUE
。
有没有一种有效的方法来生成这个虚拟变量?
非常感谢!
看起来 A
列是一串用逗号分隔的数字,因此 %in%
不合适(例如,如果您检查 B
在多个字符串的向量中,如果 A
和 B
是数字,则为数字)。如果您的数据框架结构不同,请告诉我(并随时编辑您的问题)。
您可能可以通过多种方式完成此操作。也许一种简单的方法是一次使用 grepl
一行来确定列 B
是否存在于 A
中。
library(tidyverse)
df %>%
rowwise() %>%
mutate(dummy = +grepl(B, A))
输出
# A tibble: 5 x 3
A B dummy
<fct> <fct> <int>
1 2012,2013,2014 2011 0
2 2012,2013,2014 2012 1
3 2012,2013,2014 2013 1
4 2012,2013,2014 2014 1
5 2012,2013,2014 2015 0
数据
df <- data.frame(
A = c(rep("2012,2013,2014", 5)),
B = c("2011", "2012", "2013", "2014", "2015")
)
如果你想使用 base R:
df <- data.frame(A = rep("2012,2013,2014", 5), B = c("2011", "2012","2013","2014","2015"))
for(i in 1:nrow(df)){
df$dummy[i] <- grepl(df$B[i],df$A[i])
}
制作制表符分隔文件:
A B
2012,2013,2014 2011
2012,2013,2014 2012
2012,2013,2014 2013
2012,2013,2014 2014
2012,2013,2014 2015
这是使用 stringr 中的 str_detect
的方法:
read.table('test.txt', header = TRUE) %>%
mutate(
B = as.character(B),
dummy = case_when(
str_detect(pattern = B, fixed(A)) ~ '1',
TRUE ~ '0'
)
)
这是另一个使用 tidyverse
的解决方案。主要问题是 A
被读取为字符串。我的解决方案首先将每个数字分成不同的列,然后将 B
与这些数字进行比较。
library(tidyverse)
df %>%
#Separate A into separate numbers
separate(col = A,
sep = ",",
into = c("S1","S2","S3")) %>%
#Compare B to the new columns and fill dummy
mutate(dummy = ifelse(B %in% c(S1,S2,S3), 1, 0))