我有一些列要从数据框中删除.我知道我们可以使用以下内容单独删除它们:
df$x <- NULL
Run Code Online (Sandbox Code Playgroud)
但我希望用更少的命令来做到这一点.
另外,我知道我可以使用整数索引来删除列,如下所示:
df <- df[ -c(1, 3:6, 12) ]
Run Code Online (Sandbox Code Playgroud)
但我担心我的变量的相对位置可能会改变.
考虑到R的强大程度,我认为可能有一种更好的方法,就是逐一删除每一列.
当我需要过滤data.frame,即提取满足特定条件的行时,我更喜欢使用该subset函数:
subset(airquality, Month == 8 & Temp > 90)
Run Code Online (Sandbox Code Playgroud)
而不是[功能:
airquality[airquality$Month == 8 & airquality$Temp > 90, ]
Run Code Online (Sandbox Code Playgroud)
我偏好有两个主要原因:
我发现代码从左到右读得更好.甚至那些对R一无所知的人也可以说出subset上面的陈述是做什么的.
因为列可以在select表达式中称为变量,所以我可以节省一些键击.在我上面的例子中,我只需输入airquality一次subset,但只输入三次[.
所以我过着幸福快乐,subset随处可见,因为它更短,读起来更好,甚至为我的R编码员提倡它的美丽.但昨天我的世界崩溃了.在阅读subset文档时,我注意到这一节:
警告
这是一种便于交互使用的便利功能.对于编程,最好使用像[的标准子集函数,特别是参数子集的非标准评估可能会产生意想不到的后果.
有人可以帮助澄清作者的意思吗?
首先,他们的意思是" 交互使用 "?我知道什么是交互式会话,而不是在BATCH模式下运行的脚本,但我不知道它应该有什么区别.
那么,请你解释一下" 论证子集的非标准评估 "以及为什么它是危险的,或许可以提供一个例子?
我们说t1是:
t1 <- array(1:20, dim=c(10,10))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 11 1 11 1 11 1 11 1 11
[2,] 2 12 2 12 2 12 2 12 2 12
[3,] 3 13 3 13 3 13 3 13 3 13
[4,] 4 14 4 14 4 14 4 14 4 14
[5,] 5 15 5 15 5 15 5 15 5 15
[6,] 6 16 6 16 6 16 6 …Run Code Online (Sandbox Code Playgroud) 我有以下数据框:
a b c d e
1 rr dfv 5 0.1
9 t rr1 222 0.44
7 sdf we 1 0.111
Run Code Online (Sandbox Code Playgroud)
我想选择除 d 和 e 之外的所有列。我知道我可以为此使用子集:subset(df, -c(d, e))
为什么我不能这样做df[,-c(d,e)]?
请指教。
PS @sotos 和其他人:
x[,-c("b", "c")] -c("b", "c") 中的错误:一元运算符的参数无效
我知道有不同的方法来drop一个column一个data frame的R像
现在我的问题:我有一个数据框说df有400 plus文件的形式nested data frame.
df
[[1]]
SignalIntensity SNR
1 109 6.1823089314 0.8453576915
2 110 10.1727771385 4.3837077591
3 111 7.2922746927 1.0725751161
4 112 8.8984671629 2.3192184908
5 113 9.5910338232 3.7133402249
6 114 7.9850187685 1.5008899345
7 116 7.7893230124 1.3636655582
.
.
.
[[2]]
SignalIntensity SNR
1 109 6.1823089314 0.8453576915
2 110 10.1727771385 4.3837077591
3 111 7.2922746927 1.0725751161
4 112 8.8984671629 2.3192184908
5 113 9.5910338232 …Run Code Online (Sandbox Code Playgroud) 有没有办法根据某些条件过滤掉列dplyr?这有点令人困惑,因为它与正常过滤相反。
我找不到任何直接适用于 SO 的内容。找到了这个和这个,但他们做的事情并不完全相同。
基本上,我不想根据列的值过滤掉行,而是想根据行的值删除列。
这是使用以下数据框的示例:
df <- data.frame(aa = c("1", "a", "10.2", "12.1", "8.7"),
ab = c("1", "b", "5.3", "8.1", "9.2"),
ac = c("0", "a", "1.8", "21.5", "16.0"),
ad = c("0", "b", "11.1", "15.9", "23.6"))
Run Code Online (Sandbox Code Playgroud)
我知道这是一个奇怪的数据集,并且列有不同类型的数据。这实际上是问题的原因。我正在努力清理这个。
这是一个base使用传统子集的解决方案,它返回列“ab”和“ad”:
df[, df[2,] == "b"]
Run Code Online (Sandbox Code Playgroud)
有没有办法使用dplyr? 我尝试使用filter,select并subset没有用,但我可能在这种情况下,错误地使用它们。
这几乎与此重复.我想从数据表中删除列,但我想有效地完成它.我有一个我想保留的列名列表.联系问题的所有答案都意味着做类似的事情
data.table.new <- data.table.old[, my.list]
Run Code Online (Sandbox Code Playgroud)
在某些关键点上会给我一个新对象,而旧对象仍在内存中.然而,我data.table.old是巨大的,因此我更喜欢通过引用来做到这一点,如此处所示
set(data.table.old, j = 'a', value = NULL)
Run Code Online (Sandbox Code Playgroud)
但是,由于我有列的白名单,而不是黑名单,我需要遍历所有列名,检查它们是否在my.list,然后应用set().有没有更清洁/其他方式这样做?
在像这样创建的pandas数据框中:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(10, size=(6, 6)),
columns=['c' + str(i) for i in range(6)],
index=["r" + str(i) for i in range(6)])
Run Code Online (Sandbox Code Playgroud)
这看起来如下:
c0 c1 c2 c3 c4 c5
r0 2 7 3 3 2 8
r1 6 9 6 7 9 1
r2 4 0 9 8 4 2
r3 9 0 4 3 5 4
r4 7 6 8 8 0 8
r5 0 6 1 8 2 2
Run Code Online (Sandbox Code Playgroud)
我可以使用以下方法轻松选择某些行和/或一系列列.loc: …
我正在尝试使用 lapply 和以下代码从数据帧列表中删除单个列(想要从 df1 和 df2 中删除列名“ID”)。通过命令提示符运行时,我收到以下错误消息:
eval(substitute(select), nl,parent.frame()) 中的错误:找不到对象“ID”调用:lapply -> FUN ->subset.data.frame -> eval -> eval
关于为什么代码会产生错误有什么想法吗?
df1 <- data.frame(
"Qty" = c(15,29,12,53),
"Type" = c("A","B","B","E"),
"ID" = c("x123","y121","x556","y119"))
df2 <- data.frame(
"Qty" = c(5,92,25,31),
"Type" = c("I","L","Z","K"),
"ID" = c("p433","q232","y344","l598"))
df_list <- mget(ls(pattern= "^df"))
df_list <- lapply(df_list, function(x) subset.data.frame(x, select=-c(ID)))
list2env(df_list, .GlobalEnv)
Run Code Online (Sandbox Code Playgroud) 这有效:
mtcars[, c("mpg"), drop = F]
mpg
Mazda RX4 21.0
Mazda RX4 Wag 21.0
Datsun 710 22.8
Hornet 4 Drive 21.4
Hornet Sportabout 18.7
Valiant 18.1
Duster 360 14.3
Merc 240D 24.4
Merc 230 22.8
Merc 280 19.2
Merc 280C 17.8
Merc 450SE 16.4
Merc 450SL 17.3
Merc 450SLC 15.2
Cadillac Fleetwood 10.4
Lincoln Continental 10.4
Chrysler Imperial 14.7
Fiat 128 32.4
Honda Civic 30.4
Toyota Corolla 33.9
Toyota Corona 21.5
Dodge Challenger 15.5
AMC Javelin 15.2
Camaro Z28 13.3 …Run Code Online (Sandbox Code Playgroud)