R将data.frame的一列更改为二进制向量
我已将此文件读入R中的data.frame,如您所见,第5列包含一些用“;”分隔的值。是否可以将此data.frame转换为更大的data.frame并将第5列扩展为二进制向量R将data.frame的一列更改为二进制向量,r,binary,dataframe,R,Binary,Dataframe,我已将此文件读入R中的data.frame,如您所见,第5列包含一些用“;”分隔的值。是否可以将此data.frame转换为更大的data.frame并将第5列扩展为二进制向量 > head(uinfo) V1 V2 V3 V4 V5 1 100044 1899 1 5 831;55;198;8;450;7;39;5;111 2 100054 1987 2 6
> head(uinfo)
V1 V2 V3 V4 V5
1 100044 1899 1 5 831;55;198;8;450;7;39;5;111
2 100054 1987 2 6 0
3 100065 1989 1 57 0
4 100080 1986 1 31 113;41;44;48;91;96;42;79;92;35
5 100086 1986 1 129 0
6 100097 1981 1 75 0
因此,作为一个简单的示例,如果我的前两行是:
1 100044 1899 1 5 1;2;4;7
2 100054 1987 2 6 3;8
我想得到:
1 100044 1899 1 5 1 1 0 1 0 0 1 0 0 0
2 100054 1987 2 6 0 0 1 0 0 0 0 1 0 0
我是否必须使用另一个程序(如python)来预处理数据,或者是否可以通过一些apply函数来进行预处理
谢谢您可以尝试我的“splitstackshape”软件包中的
concat.split.expanded
功能:
添加drop=TRUE
以删除原始列
此处,“mydf”的定义如下:
mydf <- structure(list(V1 = c(100044L, 100054L), V2 = c(1899L, 1987L),
V3 = 1:2, V4 = 5:6, V5 = c("1;2;4;7", "3;8")), .Names = c("V1",
"V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, -2L))
mydf您可以从我的“splitstackshape”软件包中尝试concat.split.expanded
功能:
添加drop=TRUE
以删除原始列
此处,“mydf”的定义如下:
mydf <- structure(list(V1 = c(100044L, 100054L), V2 = c(1899L, 1987L),
V3 = 1:2, V4 = 5:6, V5 = c("1;2;4;7", "3;8")), .Names = c("V1",
"V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, -2L))
mydf这里的想法是有两个要求:
将数据拆分为分号`
创建列,用零/假填充空列
#1很简单:使用strsplit
#2可以通过按照新列的数量排序,并检查它们是否在新飞溅的字符串中来完成
library(data.table)
largest <- 1e3 # (Whatever your largest expected value)
newColNames <- as.character(seq(largest))
dat[, (newColNames) := as.data.table(t(sapply(strsplit(V5, ";"), "%in%", x=seq(largest))))]
# if you really want numeric (as opposed to logical)
dat[, (newColNames) := lapply(.SD, as.numeric), .SDcols=newColNames]
库(data.table)
最大这里的想法是有两个要求:
将数据拆分为分号`
创建列,用零/假填充空列
#1很简单:使用strsplit
#2可以通过按照新列的数量排序,并检查它们是否在新飞溅的字符串中来完成
library(data.table)
largest <- 1e3 # (Whatever your largest expected value)
newColNames <- as.character(seq(largest))
dat[, (newColNames) := as.data.table(t(sapply(strsplit(V5, ";"), "%in%", x=seq(largest))))]
# if you really want numeric (as opposed to logical)
dat[, (newColNames) := lapply(.SD, as.numeric), .SDcols=newColNames]
库(data.table)
最大使用基函数(我认为步骤太多)
>df pos x cbind(df,t(位置,功能(y)替换(x,y,1)))
V1 V2 V3 V4 V5 1 2 3 4 5 6 7 8
1 100044 1899 1 5 1;2.4.7 1 1 0 1 0 0 1 0
2 100054 1987 2 6 3;8 0 0 1 0 0 0 0 1
使用基本函数(我认为步骤太多)
>df pos x cbind(df,t(位置,功能(y)替换(x,y,1)))
V1 V2 V3 V4 V5 1 2 3 4 5 6 7 8
1 100044 1899 1 5 1;2.4.7 1 1 0 1 0 0 1 0
2 100054 1987 2 6 3;8 0 0 1 0 0 0 0 1
Hello,一个可复制的示例(即,可以剪切+粘贴的内容)会很有帮助。您可以使用复制()
。看一下说明书您好,一个可复制的例子(即,可以剪切+粘贴的东西)会很有帮助。您可以使用复制()
。看看说明书+1非常好!我不熟悉splitstackshape
@RicardoSaporta,谢谢。这是一个正在进行的工作。我现在正在检查它,非常酷+1非常好!我不熟悉splitstackshape
@RicardoSaporta,谢谢。这是一项正在进行的工作。我现在正在检查,非常酷