相关疑难解决方法(0)

一次转换数据框的多个列的类型

我似乎花了很多时间从文件,数据库或其他东西创建数据帧,然后将每列转换为我想要的类型(数字,因子,字符等).有没有办法一步完成,可能是通过给出一个类型的向量?

foo<-data.frame(x=c(1:10), 
                y=c("red", "red", "red", "blue", "blue", 
                    "blue", "yellow", "yellow", "yellow", 
                    "green"),
                z=Sys.Date()+c(1:10))

foo$x<-as.character(foo$x)
foo$y<-as.character(foo$y)
foo$z<-as.numeric(foo$z)
Run Code Online (Sandbox Code Playgroud)

而不是最后三个命令,我想做类似的事情

foo<-convert.magic(foo, c(character, character, numeric))
Run Code Online (Sandbox Code Playgroud)

r type-conversion

38
推荐指数
4
解决办法
4万
查看次数

使用lapply()优雅地在data.table中分配多个列

我试图通过应用共享函数找出一种优雅的方法来使用:=赋值来一次替换多列data.table.这种情况的典型用法可能是将字符串函数(例如gsub)应用于表中的所有字符列.将data.frame这样做的方式扩展到a 并不困难data.table,但我正在寻找一种与data.table做事方式一致的方法.

例如:

library(data.table)

m <- matrix(runif(10000), nrow = 100)
df <- df1 <- df2 <- df3 <- as.data.frame(m)
dt <- as.data.table(df)
head(names(df))
head(names(dt))

## replace V20-V100 with sqrt

# data.frame approach
# by column numbers
df1[20:100] <- lapply(df1[20:100], sqrt)
# by reference to column numbers
v <- 20:100
df2[v] <- lapply(df2[v], sqrt)
# by reference to column names
n <- paste0("V", 20:100)
df3[n] <- lapply(df3[n], sqrt)

# …
Run Code Online (Sandbox Code Playgroud)

r data.table

30
推荐指数
3
解决办法
2万
查看次数

在data.table R中使用lapply .SD

我对使用.SD和不太清楚by.

例如,做下面的代码片段意思是:"改变所有的列DT到的因素,除了AB?" 它还在data.table手册中说:" .SDdata.table每个组的子集(不包括分组列)" - 所以列AB排除?

DT = DT[ ,lapply(.SD, as.factor), by=.(A,B)]
Run Code Online (Sandbox Code Playgroud)

但是,我也读过,by当你进行聚合时,这意味着在SQL中使用'group by'.例如,如果我想colsum在除了所有列之外总结(比如在SQL中)A并且B我仍然使用类似的东西吗?或者在这种情况下,下面的代码是否意味着在列AB?中取总和和值组?(A,B在SQL中使用sum和group by )

DT[,lapply(.SD,sum),by=.(A,B)]
Run Code Online (Sandbox Code Playgroud)

然后我如何做colsum除了A和之外的所有列的简单B

r data.table

29
推荐指数
1
解决办法
3万
查看次数

优雅地更新多个data.table列

我正在尝试做一个简单的事情,按照它们的平均值划分40列data.table.我无法提供实际数据(并非所有列都是数字,我有> 8M行),但这是一个例子:

library(data.table)   

dt <- data.table(matrix(sample(1:100,4000,T),ncol=40))
colmeans <- colMeans(dt)
Run Code Online (Sandbox Code Playgroud)

接下来我以为我会这样做:

for (col in names(colmeans)) dt[,col:=dt[,col]/colmeans[col]]   
Run Code Online (Sandbox Code Playgroud)

但是这会返回一个错误,因为dt[,col]要求不引用列名.使用as.name(col)不削减它.现在,

res <- t(t(dt[,1:40,with=F]/colmeans))
Run Code Online (Sandbox Code Playgroud)

包含扩展结果,但我无法将其插回到data.table中,如

dt[,1:40] <- res
Run Code Online (Sandbox Code Playgroud)

不起作用,也不起作用dt[,1:40:=res, with=F].

以下作品,但我发现它很难看:

for (i in seq_along(colmeans)) dt[,i:=dt[,i,with=F]/colmeans[i],with=F]
Run Code Online (Sandbox Code Playgroud)

当然,我也可以重新通过调用一个新的data.table data.table()res和其他非数值列我data.table有,但不是自己的东西更有效率?

r data.table

10
推荐指数
2
解决办法
8514
查看次数

R data.table:许多列的意思

我想使用data.tableR来计算另一组列的许多列的列方式.我知道如何为几列做这个,我在下面提供一个例子.但是,在我的非玩具示例中,我有几十个变量我想这样做,我想找到一种方法从列名称的向量中执行此操作.这可能吗?

library(data.table)

# creates data table
dfo <- data.frame(bananas = 1:5, 
             melonas = 6:10,
             yeah = 11:15,
             its = c(1,1,1,2,2)
             )
dto <- data.table(dfo)

# gets column means by 'its' column
dto[,
.('bananas_mean' = mean(bananas),
  'melonas_mean' = mean(melonas),
  'yeah_mean' = mean(yeah)
  ),
by = .(its)]
Run Code Online (Sandbox Code Playgroud)

r data.table

8
推荐指数
2
解决办法
8811
查看次数

R data.table 按行填充行 NA

我想在 data.table 中填充行 NA,使用 'locf',但要分别处理每一行。我似乎无法从以下结果中得到结果;

require(data.table)
set.seed(456)

# some dummy data
dt <- data.table(a = sample(1:4,6, replace=T), b = sample(1:4,6, replace=T), c = sample(1:4,6, replace=T), 
d = sample(1:4,6, replace=T), e = sample(1:4,6, replace=T),  f = sample(1:4,6, replace=T),  
g = sample(1:4,6, replace=T),  h = sample(1:4,6, replace=T),  i = sample(1:4,6, replace=T),  
j = sample(1:4,6, replace=T), xx = sample(1:4,6, replace=T))
dt[4, c:=NA]
dt[1, g:=NA]
dt[1, h:=NA]

# set colnames
cols <- setdiff(names(dt),"xx")

# use nafill over rows
dt[, (cols) := nafill(.SD, type="locf"), seq_len(nrow(dt)), …
Run Code Online (Sandbox Code Playgroud)

r data.table

8
推荐指数
2
解决办法
143
查看次数

使用.SDcols在data.table中的列子集中应用函数

我想在data.table中的变量子集上应用函数.在这种情况下,我只是改变变量类型.我可以在data.table中以几种不同的方式执行此操作,但是我正在寻找一种不需要中间分配的方法(mycols在此示例中),并且不需要我指定要更改两次的列.这是一个简化的可重现的例子:

library('data.table')
n<-30
dt <- data.table(a=sample(1:5, n, replace=T),
       b=as.character(sample(seq(as.Date('2011-01-01'), as.Date('2015-01-01'), length.out=n))),
       c1235=as.character(sample(seq(as.Date('2012-01-01'), as.Date('2013-01-01'), length.out=n))),
       d7777=as.character(sample(seq(as.Date('2012-01-01'), as.Date('2013-01-01'), length.out=n)))
)
Run Code Online (Sandbox Code Playgroud)

方式1:这有效......但它是硬编码的

mycols <- c('b', 'c1235', 'd7777')
dt1 <- dt[,(mycols):=lapply(.SD, as.Date), .SDcols=mycols]
Run Code Online (Sandbox Code Playgroud)

方式2:这有效...但我需要创建一个中间对象让它工作(mycols)

mycols <- which(sapply(dt, class)=='character')
dt2 <- dt[,(mycols):=lapply(.SD, as.Date), .SDcols=mycols]
Run Code Online (Sandbox Code Playgroud)

方式3:这有效,但我需要两次指定这个长表达式

dt3 <- dt[,(which(sapply(dt, class)=='character')):=lapply(.SD, as.Date), .SDcols=which(sapply(dt, class)=='character')]
Run Code Online (Sandbox Code Playgroud)

方式4:这不起作用,但我想要这样的东西,只允许我指定.SDcols一次变量.我正在寻找一些方法来取代有用(.SD):=的东西......或者把东西连在一起.真的,我很想知道是否有人有一个方法来执行在WAY 1,2,3中完成的操作,而没有指定一个膨胀环境并且不需要两次指定相同列的中间分配.

dt3 <- dt[,(.SD):=lapply(.SD, as.Date), .SDcols=which(sapply(dt, class)=='character')]
Run Code Online (Sandbox Code Playgroud)

r data.table

7
推荐指数
1
解决办法
2998
查看次数

使用lapply和get时的data.table列顺序

有人可以帮助我理解为什么下面的两个版本的lapply操作使用和不使用get()不会产生相同的结果?使用get()时,结果列会混淆.

dt <- data.table(v1 = c(1,2), v2 = c(3,4), type = c('A', 'B'))

   v1 v2 type
1:  1  3    A
2:  2  4    B

col_in <- c('v2', 'v1')
col_out <- paste0(col_in, '.new')
Run Code Online (Sandbox Code Playgroud)

访问'键入'硬编码方式

dt[, (col_out) := lapply(.SD, function(x){x * min(x[type == 'A'])}), .SDcols = col_in]
Run Code Online (Sandbox Code Playgroud)

产生预期的结果:

   v1 v2 type v2.new v1.new
1:  1  3    A      9      1
2:  2  4    B     12      2
Run Code Online (Sandbox Code Playgroud)

但是,当通过get()访问'type'时

dt[, (col_out) := lapply(.SD, function(x){x * min(x[get('type') == 'A'])}), .SDcols = col_in]
Run Code Online (Sandbox Code Playgroud)

对于预期值v1.newv2.new …

r lapply data.table

7
推荐指数
1
解决办法
183
查看次数

具有交互项的固定效果回归导致错误

我正在尝试估计一个面板数据集,其中包含一个表示路线的地理区域(LoadArea,DischargeArea)的交互项.使用固定效果规范时,它不喜欢交互项(LoadArea*DischargeArea)并在汇总回归时产生以下错误:

mult_fe<-plm(log(DayRate)~LoadArea *DischargeArea + factor(Laycan.Day.Diff) + CapUtil + Age
+ I(Age^2) + WFRDWT + lag_BDTI, data=mult_reg1,model="within");


summary(mult_fe)
Error in crossprod(t(X), beta) : non-conformable arguments
Run Code Online (Sandbox Code Playgroud)

这在使用lm函数替换plm的正常OLS回归中工作正常.问题是为什么它不适用于我的模型?

r plm

6
推荐指数
2
解决办法
6798
查看次数

R中另一列对多个(70)列的操作

对于以下数据,我希望每个列都被(除以) - > /相应的长度替换 .(即A/len,B/len,C/len,......)

... 意味着更多的列,最多70个.由于这有很多列,应该如何进行?

 A    B    C     D    E     F   ...   len

 2    4    5     7    8     8          5
 5    8    3     1    0     4          6
 8    9    3     9    6     2          12
 2    6    2     6    7     8          10
 1    2    4     2    9     5          20
Run Code Online (Sandbox Code Playgroud)

r dplyr data.table

4
推荐指数
1
解决办法
906
查看次数

R data.table多列重新编码/子分配

设DT为data.table:

DT<-data.table(V1=sample(10),
               V2=sample(10),
               ...
               V9=sample(10),)
Run Code Online (Sandbox Code Playgroud)

是否有更好/更简单的方法来执行多列重新编码/子分配,如下所示:

DT[V1==1 | V1==7,V1:=NA]
DT[V2==1 | V2==7,V2:=NA]
DT[V3==1 | V3==7,V3:=NA]
DT[V4==1 | V4==7,V4:=NA]
DT[V5==1 | V5==7,V5:=NA]
DT[V6==1 | V6==7,V6:=NA]
DT[V7==1 | V7==7,V7:=NA]
DT[V8==1 | V8==7,V8:=NA]
DT[V9==1 | V9==7,V9:=NA]
Run Code Online (Sandbox Code Playgroud)

变量名称完全是任意的,不一定有数字.许多列(Vx:Vx)和一个重新编码模式(NAME == 1 | NAME == 7,NAME:= something).

而且,如何多列将NA分配给其他东西.例如data.frame风格:

data[,columns][is.na(data[,columns])] <- a_value
Run Code Online (Sandbox Code Playgroud)

r multiple-columns na recode data.table

4
推荐指数
1
解决办法
1266
查看次数

如何在20列中用0代替NA?

我想用20列中的0代替NA。我发现这种方法适用于2列,但是如果列数为20,我认为这不是最佳选择。是否有其他替代方法和更紧凑的解决方案?

mydata[,c("a", "c")] <-
        apply(mydata[,c("a","c")], 2, function(x){replace(x, is.na(x), 0)})
Run Code Online (Sandbox Code Playgroud)

更新:为简单起见,让我们用8列获取此数据,并用b,c,e,f和d列替换NA

a  b  c  d  e  f  g  d
1  NA NA 2  3  4  7  6
2  g  3  NA 4  5  4  Y
3  r  4  4  NA t  5  5
Run Code Online (Sandbox Code Playgroud)

结果必须是这样的:

a  b  c  d  e  f  g  d
1  0  0  2  3  4  7  6
2  g  3  NA 4  5  4  Y
3  r  4  4  0  t  5  5
Run Code Online (Sandbox Code Playgroud)

r na

4
推荐指数
5
解决办法
1291
查看次数

应用于 data.frame 中除一列之外的所有列并替换 R 中的数据

在数据框“days”中,我想将名为“round.numbers”的函数应用于除名为“id”的列之外的所有列。

根据评论,

days[,-'id'][, lapply(X = .SD, FUN = round.numbers)] 这工作成功

但是它会创建一个新表而不是替换原始数据。

days[,-'id'] <- days[,-'id'][, lapply(X = .SD, FUN = round.numbers)] 失败的。

r lapply dataframe data.table

3
推荐指数
1
解决办法
2986
查看次数

标签 统计

r ×13

data.table ×10

lapply ×2

na ×2

dataframe ×1

dplyr ×1

multiple-columns ×1

plm ×1

recode ×1

type-conversion ×1