存在以下问题:我有两个数据帧,我希望将数据帧data1中的一个向量与来自数据帧data2的向量进行匹配.
data1 <- data.frame(v1 = c("horse", "duck", "bird"), v2 = c(1,2,3))
data2 <- data.frame(v1 = c("car, horse, mouse", "duck, bird", "bird"))
Run Code Online (Sandbox Code Playgroud)
如果data2中的字符串匹配,则应将其替换为data1中对应的值v2.结果如下:
for(i in 1:nrow(data1)) data2[,1] <- gsub(data1[i,1], data1[i,2], data2[,1], fixed=T)
data2
Run Code Online (Sandbox Code Playgroud)
但是,有没有想法使用矢量化解决方案而不是for循环来创建具有大型数据集的更好性能?
提前致谢!
- 更新:
当我遇到这种情况时会发生什么,两个数据帧的长度不一样?
data2 <- data.frame(v1 = c("car, horse, mouse", "duck, bird","bird", "bird"))
当我使用此解决方案时:
data2$v1 <- mapply(sub, data1$v1, data1$v2, data2$v1)
Run Code Online (Sandbox Code Playgroud)
然后我收到以下警告消息:
1:在mapply中(sub,data1 $ v1,data1 $ v2,data2 $ v1):较长的参数不是长度较短的倍数2:在mapply中(sub,data1 $ v1,data1 $ v2,data2 $ v1):更长参数不是短的长度的倍数
但是,mgsub解决方案非常完美!谢谢!
以下问题:
我有数据框data1与变量包括几个条目:
data1 <- data.frame(v1 = c("test, test, bird", "bird, bird", "car"))
Run Code Online (Sandbox Code Playgroud)
现在我想删除每一行中的重复条目.结果应如下所示:
data1.final <- data.frame(v1 = c("test, bird", "bird", "car"))
Run Code Online (Sandbox Code Playgroud)
我试过这个:
data1$ID <- 1:nrow(data1)
data1$v1 <- as.character(data1$v1)
data1 <- split(data1, data1$ID)
reduce.words <- function(x) {
d <- unlist(strsplit(x$v1, split=" "))
d <- paste(d[-which(duplicated(d))], collapse = ' ')
x$v1 <- d
return(x)
}
data1 <- lapply(data1, reduce.words)
data1 <- as.data.frame(do.call(rbind, data1))
Run Code Online (Sandbox Code Playgroud)
但是,这会产生空行,但第一行除外.有人想解决这个问题吗?
有没有办法根据土耳其语更改R中的字符编码系统?
\n\n我尝试在将 R 脚本保存为 iso-8859-9、windows-1254 或 latin5 时更改编码。最后的编码给了我最好的结果,但是当我重新加载 R 脚本时,并非所有字符都被正确保存。例如:
\n\n原来的:
\n\nh\xc3\xa2kimiyetinin\n\xc3\xa7\xc4\xb1k\xc4\xb1yor\nRun Code Online (Sandbox Code Playgroud)\n\n重新加载(第二个示例中的角色已被破坏):
\n\nh\xc3\xa2kimiyetinin\n\xc3\xa7\xc3\xbdk\xc3\xbdyor\nRun Code Online (Sandbox Code Playgroud)\n\n有人有想法吗?先感谢您!
\n