我有这样的角色矢量:
a <- c("a,b,c", "a,b", "a,b,c,d")
我想要做的是创建一个如下所示的数据框:
a b c d
1] 1 1 1 0
2] 1 1 0 0
3] 1 1 1 1
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,我需要使用的某种组合read.table和reshape,但我真的很挣扎.任何和帮助赞赏.
在我的表中,一些单元格是向量而不是单个值,即列是列表而不是向量:
dt1 <- data.table(
colA= c('A1','A2','A3'),
colB=list('B1',c('B2a','B2b'),'B3'),
colC= c('C1','C2','C3'),
colD= c('D1','D2','D3')
)
dt1
# colA colB colC colD
#1: A1 B1 C1 D1
#2: A2 B2a,B2b C2 D2
#3: A3 B3 C3 D3
Run Code Online (Sandbox Code Playgroud)
我需要将其重新整理成一个长格式的列表colB.到目前为止我这样做:
dt1[,.(colB=unlist(colB)),by=.(colA,colC,colD)]
# colA colC colD colB
#1: A1 C1 D1 B1
#2: A2 C2 D2 B2a
#3: A2 C2 D2 B2b
#4: A3 C3 D3 B3
Run Code Online (Sandbox Code Playgroud)
它完成了工作,但我不喜欢我必须明确指出所有其他列名称by=.有没有更好的方法来做到这一点?
(我确定它已经在其他地方得到了解答,但到目前为止我找不到它)
PS理想情况下我想管理没有任何外部包
我有下表:
FN LN LN1 LN2 LN3 LN4 LN5
a b b x x x x
a c b d e NA NA
a d c a b x x
a e b c d x e
Run Code Online (Sandbox Code Playgroud)
我正在过滤LN1到LN5中存在LN的记录.
我用过的代码:
testFilter = filter(test, LN %in% c(LN1, LN2, LN3, LN4, LN5))
Run Code Online (Sandbox Code Playgroud)
结果不是我所期望的:
ï..FN LN LN1 LN2 LN3 LN4 LN5
1 a b b x x x x
2 a c b d e <NA> <NA>
3 a d c a b x x …Run Code Online (Sandbox Code Playgroud) 我有2列数据具有相同类型的数据(字符串).
我想加入列的级别.即.我们有:
col1 col2
Bob John
Tom Bob
Frank Jane
Jim Bob
Tom Bob
... ... (and so on)
Run Code Online (Sandbox Code Playgroud)
现在col1有4个等级(Bob,Tom Frank,Jim),col2有3个等级(John,Jane,Bob)
但是我希望两个列都具有所有因子级别(Bob,Tom,Frank,Jim,Jane,John),以便稍后用唯一的id替换每个'names',这样最终的输出将是:
col1 col2
1 5
2 1
3 6
4 1
2 1
Run Code Online (Sandbox Code Playgroud)
那是两个列中的Bob - > 1,Tom - > 2等.
有任何想法吗 :) ?
编辑:谢谢大家的精彩答案!据我所知,你们都很棒:)
我在变量中有一个字符串,我们称之为v1.该字符串表示图片编号,采用"Pic 27 + 28"的形式.我想提取第一个数字并将其存储在一个名为item的新变量中.
我尝试过的一些代码是:
item <- unique(na.omit(as.numeric(unlist(strsplit(unlist(v1),"[^0-9]+")))))
Run Code Online (Sandbox Code Playgroud)
这很好,直到我找到了一个列表:
[1,] "Pic 26 + 25"
[2,] "Pic 27 + 28"
[3,] "Pic 28 + 27"
[4,] "Pic 29 + 30"
[5,] "Pic 30 + 29"
[6,] "Pic 31 + 32"
Run Code Online (Sandbox Code Playgroud)
在这一点上,我获得了比我想要的更多的数字,因为它也抓住了其他唯一的数字(25).
我实际上尝试过使用gsub,但没有任何工作.帮助将非常感激!
当列的元素具有不同的字符串数时,我遇到了拆分列值的问题.我可以在plyr中做到这一点,例如:
library(plyr)
column <- c("jake", "jane jane","john john john")
df <- data.frame(1:3, name = column)
df$name <- as.character(df$name)
df2 <- ldply(strsplit(df$name, " "), rbind)
View(df2)
Run Code Online (Sandbox Code Playgroud)
因此,我们的数据框的列数与给定元素中的最大蜇数有关.
当我尝试在dplyr中执行此操作时,我使用了do函数:
library(dplyr)
df2 <- df %>%
do(data.frame(strsplit(.$name, " ")))
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
Run Code Online (Sandbox Code Playgroud)Error in data.frame("jake", c("jane", "jane"), c("john", "john", "john" : arguments imply differing number of rows: 1, 2, 3
在我看来应该使用rbind功能,但我不知道在哪里.
训练集
trainSample <- cbind(data[1:980,1], data[1:980,2]) cl <-
factor(c(data[1:980,3]))
Run Code Online (Sandbox Code Playgroud)
测试集
testSample <- data(data[981:1485,1], data[981:1485,2])
cl.test <- clknn
Run Code Online (Sandbox Code Playgroud)
预测
k <- knn(trainSample, testSample, cl, k = 5)
Run Code Online (Sandbox Code Playgroud)
产量
< k
[1] 2 2 1 1 1 1 2 1 2 1 1 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 1 2 2 1 1 2 2 2 2 1 2 2 2 2 2 2 1 2 …Run Code Online (Sandbox Code Playgroud) 我df看起来像这样:
Id Task Type Freq
3 1 A 2
3 1 B 3
3 2 A 3
3 2 B 0
4 1 A 3
4 1 B 3
4 2 A 1
4 2 B 3
Run Code Online (Sandbox Code Playgroud)
我想通过Id进行重组并得到:
Id A B … Z
3 5 3
4 4 6
Run Code Online (Sandbox Code Playgroud)
我试过了:
df_wide <- dcast(df, Id + Task ~ Type, value.var="Freq")
Run Code Online (Sandbox Code Playgroud)
并得到错误:
聚合函数缺失:默认为长度
我无法弄清楚要放什么fun.aggregate.有什么问题?
我想将data.table行转换为向量.这对我有用:
unlist(dt[row_num])
Run Code Online (Sandbox Code Playgroud)
但是有更原生的解决方案吗?我也不喜欢上面保留名称的时候我真的想要一个纯数字向量,然后导致:
as.numeric(unlist(dt[row_num]))
Run Code Online (Sandbox Code Playgroud)
似乎应该有更好的选择.
我有一个时间向量,它是因子的格式.例如,Time [1]是8:01:01,class(Time [1])是factor.
现在我想从这个向量中提取小时和分钟.这种计算效率最高的方法是什么?我的矢量非常大.非常感谢,