R 如果行包含字符串,则为伪列

R 如果行包含字符串,则为伪列,r,dummy-variable,R,Dummy Variable,我有一个数据集,看起来像这样: x <- data.frame(id=c(1,2,3), col1=c("UX1", "UX3", "UX2"), col2=c("UX2", "UX1", "UX1"), col3=c("PROC1", "PROC2", "PROC3"), col4=c("PROC3", "PROC3", "PROC1")

我有一个数据集,看起来像这样:

x <- data.frame(id=c(1,2,3), 
               col1=c("UX1", "UX3", "UX2"),
               col2=c("UX2", "UX1", "UX1"),
               col3=c("PROC1", "PROC2", "PROC3"),
               col4=c("PROC3", "PROC3", "PROC1")
               )
x2 <- data.frame(id=c(1,2,3),  
           col1=c("UX1", "UX3", "UX2"),
           col2=c("UX2", "UX1", "UX1"),
           col3=c("PROC1", "PROC2", "PROC3"),
           col43=c("PROC3", "PROC3", "PROC1"),

           UX1=c(1,1,1),
           UX2=c(1,0,1),
           UX3=c(0,1, 0),
           PROC1 =c(1,0,1),
           PROC2=c(0,1,0),
           PROC3 = c(1,1,1))
我希望输出像这样:

x <- data.frame(id=c(1,2,3), 
               col1=c("UX1", "UX3", "UX2"),
               col2=c("UX2", "UX1", "UX1"),
               col3=c("PROC1", "PROC2", "PROC3"),
               col4=c("PROC3", "PROC3", "PROC1")
               )
x2 <- data.frame(id=c(1,2,3),  
           col1=c("UX1", "UX3", "UX2"),
           col2=c("UX2", "UX1", "UX1"),
           col3=c("PROC1", "PROC2", "PROC3"),
           col43=c("PROC3", "PROC3", "PROC1"),

           UX1=c(1,1,1),
           UX2=c(1,0,1),
           UX3=c(0,1, 0),
           PROC1 =c(1,0,1),
           PROC2=c(0,1,0),
           PROC3 = c(1,1,1))
因此,如果一行包含字符串,则调用basicalle来创建一个伪值。我可以使用
library(dummies)
创建
dummy.data.frame


y这是一个通过
tidyverse
实现的想法。我们首先
收集
id
变量之外的所有变量。然后,我们将
spread
以获得所需的结构,并使用一个简单的
replace
来“dummify”我们的数据,即

library(tidyverse)

x %>% 
 gather(var, val, -id) %>% 
 spread(val, var, fill = 0) %>% 
 mutate_at(vars(-id), funs(replace(., . != 0, 1)))
这就给了,

然后,您可以非常轻松地
cbind()
到原始数据帧,即

x2 <- x %>% 
  gather(var, val, -id) %>% 
  spread(val, var, fill = 0) %>% 
  mutate_at(vars(-id), funs(replace(., . != 0, 1)))

cbind(x, x2)
#   id proc1 proc2 proc3 proc4 id PROC1 PROC2 PROC3 UX1 UX2 UX3
#1  1   UX1   UX2 PROC1 PROC3  1     1     0     1   1   1   0
#2  2   UX3   UX1 PROC2 PROC3  2     0     1     1   1   0   1
#3  3   UX2   UX1 PROC3 PROC1  3     1     0     1   1   1   0

下面是通过
tidyverse
提出的一个想法。我们首先
收集
id
变量之外的所有变量。然后,我们将
spread
以获得所需的结构,并使用一个简单的
replace
来“dummify”我们的数据,即

library(tidyverse)

x %>% 
 gather(var, val, -id) %>% 
 spread(val, var, fill = 0) %>% 
 mutate_at(vars(-id), funs(replace(., . != 0, 1)))
这就给了,

然后,您可以非常轻松地
cbind()
到原始数据帧,即

x2 <- x %>% 
  gather(var, val, -id) %>% 
  spread(val, var, fill = 0) %>% 
  mutate_at(vars(-id), funs(replace(., . != 0, 1)))

cbind(x, x2)
#   id proc1 proc2 proc3 proc4 id PROC1 PROC2 PROC3 UX1 UX2 UX3
#1  1   UX1   UX2 PROC1 PROC3  1     1     0     1   1   1   0
#2  2   UX3   UX1 PROC2 PROC3  2     0     1     1   1   0   1
#3  3   UX2   UX1 PROC3 PROC1  3     1     0     1   1   1   0

为了完整起见,还建议使用data.table替代方案:

# load the data table package
library(data.table)

# create the sample data set
x <- data.frame(id=c(1,2,3), 
                col1=c("UX1", "UX3", "UX2"),
                col2=c("UX2", "UX1", "UX1"),
                col3=c("PROC1", "PROC2", "PROC3"),
                col4=c("PROC3", "PROC3", "PROC1")
)

# convert data frame to data table
x <- data.table(x)

# first convert data to long format using melt function
# then use cast to go back to wide format, convert "value" variable to columns and check where are missing values
# then join on the original data set
x[dcast(melt(x, "id"), id ~ value, fun = function(x) sum(!is.na(x))), on = "id"]
#加载数据表包
库(数据表)
#创建示例数据集

x仅为了完整性,还建议使用数据表替代方案:

# load the data table package
library(data.table)

# create the sample data set
x <- data.frame(id=c(1,2,3), 
                col1=c("UX1", "UX3", "UX2"),
                col2=c("UX2", "UX1", "UX1"),
                col3=c("PROC1", "PROC2", "PROC3"),
                col4=c("PROC3", "PROC3", "PROC1")
)

# convert data frame to data table
x <- data.table(x)

# first convert data to long format using melt function
# then use cast to go back to wide format, convert "value" variable to columns and check where are missing values
# then join on the original data set
x[dcast(melt(x, "id"), id ~ value, fun = function(x) sum(!is.na(x))), on = "id"]
#加载数据表包
库(数据表)
#创建示例数据集

x@Tino:这种方法与dummy.data.frame基本相同。你能再看看这个问题吗?@Tino:这个方法基本上与dummy.data.frame相同。你能再看一遍这个问题吗?谢谢!在我第一次提交后,我更改了列名,并将其命名为“col1”“col2”。我想我会把它们改回去,因为您使用了数据的第一种格式。名称不重要。你仍然会得到同样的结果@Sotos。是的,你是在浪费时间把名字改回来。PS我很高兴你使用了tidyverse…@Sotos只是一个小建议:我们可以做一个左连接(x,x2,by=“id”)而不是cbind.?去掉双id列,在我看来更安全。@Sotos&mmn:我还有一个问题:既然我有了数字虚拟列,我想用dist函数生成一个距离矩阵。假设我的id列现在是字符。当我计算
dist(x2)
dist(x2[2:7])
即,当排除id列时,我会得到两个不同的结果??当存在字符列时,dist函数如何工作??通常我应该如何处理我的“id”“计算距离矩阵时的列?我应该把它们作为行名吗?我通常使用tidyverse和tibbles…谢谢!在我第一次提交后,我更改了列名,并将其命名为“col1”“col2”。我想我会把它们改回去,因为您使用了数据的第一种格式。名称不重要。你仍然会得到同样的结果@Sotos。是的,你是在浪费时间把名字改回来。PS我很高兴你使用了tidyverse…@Sotos只是一个小建议:我们可以做一个左连接(x,x2,by=“id”)而不是cbind.?去掉双id列,在我看来更安全。@Sotos&mmn:我还有一个问题:既然我有了数字虚拟列,我想用dist函数生成一个距离矩阵。假设我的id列现在是字符。当我计算
dist(x2)
dist(x2[2:7])
即,当排除id列时,我会得到两个不同的结果??当存在字符列时,dist函数如何工作??通常,在计算距离矩阵时,我应该如何处理我的“id”列?我应该将它们作为行名称吗?我通常使用tidyverse和tibbles。。。