- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有 dim 的 data.frame:160560 x 171。有很多数据,但几乎 90% 都是 NA。
我愿意使用的算法(我们称之为 ALG)不允许 data.frame 中有任何 NA。我的想法是找到这个 data.frame 的最佳子集并在其上使用 ALG。
当我说子集时,我在想什么? data.frame(有 171 列)的 n 列(n<171)子集,不包含任何 NA(所有行都已满)。
当我说最好的时候,我在想什么?该子集可能拥有的行数最多。 F.e.如果我有两个 20 列的子集,第一个有 1152 行,第二个有 2254 行,我选择第二个。
问题是简单的组合在那里不起作用,因为 combn(1:171,20) 的结果超过 5*10^25。
R 中是否有任何库可以帮助我处理这个问题?
最佳答案
这是使用 crossprod
实现的一种方法.对于给定的列数,这将为您提供具有最大非 NA 行数的列。没有办法绕过它,您必须选择多个列才能获得。否则,您最终总是会选择 NA 最少的一列
首先,让我们为这个例子创建一个初始矩阵。此时它必须是一个矩阵。使用,as.matrix
根据需要在您的数据上。
set.seed(2)
x <- runif(150)
x[sample(1:150, 15, replace = FALSE)] <- NA
x <- matrix(x,ncol=10)
round(x,1)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0.2 0.9 0.0 0.8 0.8 0.8 1.0 0.6 0.0 0.7
[2,] 0.7 1.0 0.2 1.0 0.9 0.3 0.4 0.9 0.2 0.5
[3,] 0.6 0.2 0.8 0.3 0.6 0.9 0.4 0.5 NA 0.8
[4,] 0.2 0.4 0.9 0.5 0.3 0.4 0.6 0.1 0.9 0.2
[5,] 0.9 0.1 0.5 0.8 0.9 0.6 0.5 0.1 0.2 0.4
[6,] 0.9 0.7 0.6 0.0 0.4 0.4 0.2 0.0 0.8 0.2
[7,] NA 0.4 0.8 0.0 0.4 0.7 0.4 0.7 0.6 0.3
[8,] 0.8 0.8 0.3 0.7 0.5 0.0 0.1 0.4 0.3 0.6
[9,] 0.5 0.2 0.7 NA 0.2 0.4 0.1 NA 0.7 0.3
[10,] 0.5 NA 0.2 0.3 0.1 0.2 0.4 0.8 0.3 NA
[11,] 0.6 0.5 NA 0.8 0.3 0.9 0.2 0.8 0.2 0.7
[12,] NA 0.1 NA 0.8 0.3 1.0 0.4 0.9 NA 0.7
[13,] 0.8 NA 0.1 NA 0.0 0.3 1.0 NA 0.0 0.3
[14,] 0.2 1.0 0.2 0.6 0.2 0.7 NA 1.0 NA 0.5
[15,] 0.4 0.1 0.9 0.7 0.2 0.3 0.3 0.6 0.3 0.3
如您所见,第 5 列和第 6 列没有 NA
现在,让我们创建一个类似的矩阵,其中 NA 为 0,非 NA 为 1。
is_na_vector<- ifelse(is.na(x),0,1)
之后,让我们计算crossproduct
:
crossprod_vector <- crossprod(is_na_vector)
colSums(crossprod_vector)
[1] 119 120 119 120 135 135 127 120 111 127
可以看到,第 5 列和第 6 列的 colSums
最高.这意味着,结合其他变量,它们具有最少数量的 NA
然后我们使用该 colSums 向量来选择多个列。这将对所有列进行排名并给出 n
第一的。这是具有最大非 NA 行数的三列。在本例中为 14 行。此时可能会有联系,但当您选择 20 列时应该不会有问题。
n <- 3
x_df <- as.data.frame(x) #to get meaningful colnames
res <- x_df[,rank(-colSums(crossprod_vector),ties.method ="first")<=n ] #use "-" to get decreasing rank
res
V5 V6 V7
1 0.7700279 0.7554624 0.9767552
2 0.8869842 0.2880597 0.3970164
3 0.6251217 0.8678447 0.3799989
4 0.2603000 0.4026427 0.5603876
5 0.8590731 0.5726850 0.4638082
6 0.4374880 0.3506426 0.1967768
7 0.3881448 0.6719989 0.4269434
8 0.4615011 0.0250504 0.0930252
9 0.2186752 0.4011010 0.1153091
10 0.0659355 0.1999765 0.4400317
11 0.2757010 0.8565250 0.2009347
12 0.3103811 0.9715154 0.4276391
13 0.0421755 0.3237224 0.9806000
14 0.1846735 0.7331914 NA
15 0.1833732 0.3400682 0.2869739
使用 na.omit
获取非 NA 行:
na.omit(res)
V5 V6 V7
1 0.7700279 0.7554624 0.9767552
2 0.8869842 0.2880597 0.3970164
3 0.6251217 0.8678447 0.3799989
4 0.2603000 0.4026427 0.5603876
5 0.8590731 0.5726850 0.4638082
6 0.4374880 0.3506426 0.1967768
7 0.3881448 0.6719989 0.4269434
8 0.4615011 0.0250504 0.0930252
9 0.2186752 0.4011010 0.1153091
10 0.0659355 0.1999765 0.4400317
11 0.2757010 0.8565250 0.2009347
12 0.3103811 0.9715154 0.4276391
13 0.0421755 0.3237224 0.9806000
15 0.1833732 0.3400682 0.2869739
您可以看到使用 nrow
得到了多少非 NA 行:
nrow(na.omit(res)) #14
对于 n <- 5
,我得到 12 个非 NA 行
关于r - 没有 NA 的 data.frame 的最佳可能子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42858959/
最近,我在 XCode 上的调试器停止正常工作,并给出了以下错误: 此帧内的前一帧(gdb 无法展开超过此帧) 我已经浏览过 SO 的另一个线程,谈论丢失的符号。我通过删除符号目录并让它从 iPod
当我在设备上遇到断点时,出现以下调试器错误: 来自调试器的错误:此帧内的上一帧(gdb 无法展开超过此帧) 当应用程序遇到断点时,就会发生这种情况。如果我点击调试器中的继续按钮,它会愉快地继续,直到下
如何在 WinRT XAML 应用程序中操作框架的历史记录? 用户将从我的中心页面开始,他们可以在其中选择一个现有项目以转到其编辑屏幕,或者他们可以选择“新项目”。 “新项目”将引导他们完成一个简短的
2 帧,我希望第 2 帧“覆盖”/更新第 1 帧。基本上,其中 Table1-colB-value = Table2-oldB-value,用 Table2-newB-value 覆盖 Table1-
我正在尝试逐帧动画,但它给了我一个强制关闭,我不确定为什么它给我一个强制关闭。在我看来一切都很好。 这是我的代码,我希望有人能帮忙吗?提前致谢。 动画测试.java import android.ap
这是我的主课。 package pomsystem; public class POMSystem { public static void main(String[] args) {
如果为TRUE,我想从函数返回一个data.frame,否则使用return(ifelse(condition, mydf, NA)) 返回NA 但是, ifelse 会从 data.frame 中删
我正在处理两个 csv 文件并导入为数据框 df1 和 df2 df1 有 50000 行,df2 有 150000 行。 我想比较(遍历每一行)df2 的“时间”df1,求时间差,返回所有列的值对应
我将许多文件夹中的小文本文件读取到一个列表中。因此,我有一个长度为 n 的列表,其中包含 2 个 data.frames。 这是列表元素 3 的示例(在问题末尾输入) ip_list[[3]] $`d
为了找出数据框 df.a 是否是数据框 df.b 的子集,我做了以下操作: df.a semi_join(df.b, df.a) Joining by: c("x", "y") x y 1 1
在某些情况下,出于实现原因,我有一个只包含一个列的 data.frame df=as.data.frame(alpha=1:15) 如果我现在使用 df[-1, ] 它返回一个向量,但我想将它保留为一
Windows 8.1 商店应用中的 Frame.Navigate() 和 this.Frame.Navigate() 有什么区别? 这有什么区别 Frame.Navigate(typeof(Logi
我有两个 data.frames (df1, df2),我想用 df1$V2 的值替换 P1-P10 列中的字母值,但保留前两列df2. df1 = data.frame(V1=LETTERS, V2
有没有更好的方法来制作与现有 data.frame 具有相同维度、列名和行名的空白 data.frame? BAM<-read.table(~/myfile) # 10 rows and 10 co
我有一个列表 data.frame s。例如 set.seed(1) my_list result.df id var_p var_m var_d var_a
假设我有两个数据框 df1 和 df2 如下 Df1 Id Price Profit Month 10 5 2 1 10 5 3 2 10 5 2
我将创建一个网站,除了它自己的内容之外,它还将链接(在 iframe 中)到世界最大的报纸网站,如纽约时报、金融时报和其他一些网站。 但是我遇到了框架许可的问题。例如,纽约时报向我展示了一个错误 Lo
假设我有一个 data.frame: df x x A 1 10 2 20 3 30 从文档中(参见 ?"[" )您可以找到: If drop=TRUE the result is coer
我有一个想要克隆的现有 data.frame,但没有其中的值。 IE。我希望新框架具有与现有框架相同的列名称和类型。原始帧的大小可能为 GB 量级,因此复制和删除数据似乎不是正确的方法,并且迭代现有列
给定两个在列名称/数据类型方面相同的数据帧,其中某些列唯一标识行,是否有一种有效的函数/方法可以让一个数据帧“更新”另一个数据帧? 例如,在下面的例子中,原始和替换由'Name'和'Id'标识>。 g
我是一名优秀的程序员,十分优秀!