我在data.frame中遇到了前导和尾随空格的麻烦.例如,我想看看在特定row
的data.frame
基础上有一定的条件:
> myDummy[myDummy$country == c("Austria"),c(1,2,3:7,19)]
[1] codeHelper country dummyLI dummyLMI dummyUMI
[6] dummyHInonOECD dummyHIOECD dummyOECD
<0 rows> (or 0-length row.names)
Run Code Online (Sandbox Code Playgroud)
我想知道为什么我没有得到预期的产量,因为奥地利显然存在于我的国家data.frame
.在查看我的代码历史并试图弄清楚出了什么问题后,我尝试了:
> myDummy[myDummy$country == c("Austria "),c(1,2,3:7,19)]
codeHelper country dummyLI dummyLMI dummyUMI dummyHInonOECD dummyHIOECD
18 AUT Austria 0 0 0 0 1
dummyOECD
18 1
Run Code Online (Sandbox Code Playgroud)
我在命令中改变的是奥地利之后的另一个空格.
显然会出现更烦人的问题.例如,当我想根据国家/地区列合并两个帧时.一个data.frame
用于"Austria "
另一个帧"Austria"
.匹配不起作用.
到目前为止,我曾经写过一个Perl
删除空格的简单脚本,但如果我可以在R里面以某种方式做到这一点会很好.
将我data.frame
从宽表转换为长表时遇到一些麻烦.目前它看起来像这样:
Code Country 1950 1951 1952 1953 1954
AFG Afghanistan 20,249 21,352 22,532 23,557 24,555
ALB Albania 8,097 8,986 10,058 11,123 12,246
Run Code Online (Sandbox Code Playgroud)
现在我想把它data.frame
变成一个长期的data.frame
.像这样的东西:
Code Country Year Value
AFG Afghanistan 1950 20,249
AFG Afghanistan 1951 21,352
AFG Afghanistan 1952 22,532
AFG Afghanistan 1953 23,557
AFG Afghanistan 1954 24,555
ALB Albania 1950 8,097
ALB Albania 1951 8,986
ALB Albania 1952 10,058
ALB Albania 1953 11,123
ALB Albania 1954 12,246
Run Code Online (Sandbox Code Playgroud)
我已经看过并尝试了它melt()
的reshape()
功能,因为有些人提出了类似的问题.但是,到目前为止我只得到凌乱的结果.
如果有可能我想用这个reshape() …
我想把merge
几个data.frames
合二为一data.frame
.因为我有一个完整的文件列表,我试图用循环结构来做.
到目前为止,循环方法工作正常.然而,它看起来效率很低,我想知道是否有更快更容易的方法.
这是场景:我有一个包含多个.csv
文件的目录.每个文件包含可用作合并变量的相同标识符.由于文件的大小相当大,我想把每个文件一次一个地读入R而不是一次读取所有文件.所以我得到了目录的所有文件,list.files
并在前两个文件中读取.之后我用它merge
来买一个data.frame
.
FileNames <- list.files(path=".../tempDataFolder/")
FirstFile <- read.csv(file=paste(".../tempDataFolder/", FileNames[1], sep=""),
header=T, na.strings="NULL")
SecondFile <- read.csv(file=paste(".../tempDataFolder/", FileNames[2], sep=""),
header=T, na.strings="NULL")
dataMerge <- merge(FirstFile, SecondFile, by=c("COUNTRYNAME", "COUNTRYCODE", "Year"),
all=T)
Run Code Online (Sandbox Code Playgroud)
现在我使用for
循环将所有剩余的.csv
文件和merge
它们放入已存在的文件中data.frame
:
for(i in 3:length(FileNames)){
ReadInMerge <- read.csv(file=paste(".../tempDataFolder/", FileNames[i], sep=""),
header=T, na.strings="NULL")
dataMerge <- merge(dataMerge, ReadInMerge, by=c("COUNTRYNAME", "COUNTRYCODE", "Year"),
all=T)
}
Run Code Online (Sandbox Code Playgroud)
即使它工作得很好我想知道是否有更优雅的方式来完成工作?
我在使用ES时使用ESS以便留在Emacs中.每当我创建一个绘图时,都会出现一个带有图形的新弹出窗口.这个新窗口似乎是Emacs内部调用的R进程的一部分.因此,新窗口不是缓冲区列表的一部分,似乎位于Emacs环境之外.
R创建的新窗口,包含例如plot()调用的图形或ggplot2/lattice中的各个函数,是否会被强制保留在Emacs环境中?这样该图可用作新的缓冲区.
谢谢!
我的SELECT ... INTO OUTFILE
声明中遇到了一些许可问题.
当我登录我的数据库并执行简单的导出命令时,例如:
mysql> select * from XYZ into outfile '/home/mropa/Photos/Desktop/TEST.txt';
Run Code Online (Sandbox Code Playgroud)
我得到了回应:
ERROR 1 (HY000):
Can't create/write to file '/home/mropa/Photos/Desktop/TEST.txt'
(Errcode: 13)
Run Code Online (Sandbox Code Playgroud)
但是,当我简单地写:
mysql> select * from XYZ into outfile 'TEST.txt';
Query OK, 8287 rows affected (0.73 sec)
Run Code Online (Sandbox Code Playgroud)
该文件将写入目录/var/lib/mysql/XYZ
.我查看了/etc/apparmor.d/usr.sbin.mysqld
mysql似乎定义了读取和写入权限的文件,但我真的不知道如何修改它.
如何允许自己将mysql表导出到我喜欢的任何目录中?
我正在浏览我的一个.R文件并稍微清理一下我试图更熟悉用r -ight方式编写代码.作为初学者,我最喜欢的出发点之一是摆脱for()
循环并尝试将表达式转换为函数式编程形式.所以这是场景:
我正在组装一堆data.frames
以list
供以后使用.
dataList <- list (dataA,
dataB,
dataC,
dataD,
dataE
)
Run Code Online (Sandbox Code Playgroud)
现在我想查看每个data.frame的列名并替换某些字符串.例如,我喜欢用"baz"替换每个"foo"和"bar".目前,我正在通过一个for()
看起来有点尴尬的循环完成工作.
colnames(dataList[[1]])
[1] "foo" "code" "lp15" "bar" "lh15"
colnames(dataList[[2]])
[1] "a" "code" "lp50" "ls50" "foo"
matchVec <- c("foo", "bar")
for (i in seq(dataList)) {
for (j in seq(matchVec)) {
colnames (dataList[[i]])[grep(pattern=matchVec[j], x=colnames (dataList[[i]]))] <- c("baz")
}
}
Run Code Online (Sandbox Code Playgroud)
因为我在这里工作,list
我想到了这个lapply
功能.我尝试使用该lapply
功能处理这项工作似乎都很正常,但只是乍一看.如果我写
f <- function(i, xList) {
gsub(pattern=c("foo"), replacement=c("baz"), x=colnames(xList[[i]]))
}
lapply(seq(dataList), f, xList=dataList)
Run Code Online (Sandbox Code Playgroud)
最后一行打印出几乎我要找的东西.但是,如果我再看一下dataList中data.frames的实际名称:
lapply (dataList, colnames) …
Run Code Online (Sandbox Code Playgroud) 我有一个数据et,喜欢while
用Perl脚本做一个简单的操作.以下是数据集中的一个小提取:
"number","code","country","gamma","X1","X2","X3","X4","X5","X6"1,"DZA","Algeria"," 0.01",7.44,47.3,0.46,0,0,0.13 2,"AGO","安哥拉","0.00",6.79,"空",0.21,1,0,0.28 3,"BEN","贝宁" ," - 0.01",7.02,38.9,0.27,1,0,0.05 4,"BWA","博茨瓦纳","0.06",6.28,45.7,0.42,1,0,0.07 5,"HVO","布基纳Faso","0.00",6.15,36.3,0.08,1,0,0.05 6,"BDI","布隆迪","0.00",6.38,41.8,0.18,1,0,0
脚本应计算每个,
分隔字段的长度,并将最高值存储到数组中.
但是,保存无法正常工作.这是代码的一部分:
@maxl = map length, @terms;
while(`<INFILE>`) {
$_ =~ s/[\"\n]//g ;
@terms = split/$sep/, $_;
@lengths = map length, @terms;
for($k = 0, $k <= $#terms, $k++) {
if($lengths[$k] > $maxl[$k]) {
$maxl[$k] = $lenghts[$k];
}
}
print "@lengths\n";
}
Run Code Online (Sandbox Code Playgroud)
现在@maxl
使用代码中的早期部分,它使用数据集的第二行.当我使用print
命令只是为了看到@maxl
我得到的操作的值:
1 3 7 4 4 4 4 1 1 5
在while
循环中我使用另一个print
语句来查看其他值,我得到:
1 …
Run Code Online (Sandbox Code Playgroud) 我喜欢把数组变成哈希.但是,每个键的值长度不等.
可以说我有
my @array = qw( A 0 B 1 2 3 4 c 5 d 6 7);
Run Code Online (Sandbox Code Playgroud)
现在我喜欢使用字母作为键,并且对于每个这样的字母/键,使用以下数字作为它们的值.所以@array
应该转变成%hash
如下
my %hash = ( A => [0],
B => [1, 2, 3, 4],
c => [5],
d => [6, 7]
);
Run Code Online (Sandbox Code Playgroud)
对我来说困难的是每个键值的不等长度.