※ 引述《huangsam (sam)》之铭言:
: [问题类型]:
:
: 程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
:
: [软件熟悉度]:
: 请把以下不需要的部份删除
: 使用者(已经有用R 做过不少作品)
:
: [问题叙述]:
: 请简略描述你所要做的事情,或是这个程式的目的
: 目前有个DATA 想要判断在某个列是否被取代过如果没有被取代过就换新的
: 举例
: DATA
: 字段1
: NA
: NA
: NA
: NA
: NA
: NA
: NA
: NA
: 好比说我前面有先跑程式发现我想取代1,3,5列
: 那我就先判断是否为NA若是NA则改写成A
: 改写如下
: A
: NA
: A
: NA
: A
: NA
: .
: .
: .
: 接下来我会再判断要被替换的列为1,4,改写成B
: 因为第一列被改写则为但是第四列没有则指会改写第四列
: A
: NA
: A
: B
: A
: NA
: .
: .
: .
: 想问有没有更快速的方法因为有时候资料量大的时候会跑比较久
: [程式范例]:
:
: for(j in which(ind==1))
: {
: DT[j] <- ifelse(DT[j]==0, 要被取代的值,DT[i] )
: }
:
: [环境叙述]:
:
:
: [关键字]:
: which , for ,ifelse
:
: 选择性,也许未来有用
:
可以使用dplyr的操作去处理
# 生成资料 跟 生成要改值的位置以及对应的值
df <- data.frame(a = rep(NA_real_, 20L)) # NA_real_ 表示为numeric的NA
set.seed(10)
changeLocVal <- list(list(loc = sort(sample(1L:20L, 10L)), value = 5),
list(loc = sort(sample(1L:20L, 10L)), value = 3))
print(changeLocVal)
# [[1]]
# [[1]]$loc
# [1] 2 4 5 6 8 11 12 14 15 18
#
# [[1]]$value
# [1] 5
#
#
# [[2]]
# [[2]]$loc
# [1] 1 3 4 5 6 7 10 11 14 19
#
# [[2]]$value
# [1] 3
# 可以看到changeLocVal[[2]]$loc有五个点跟changeLocVal[[1]]$loc重复
# 所以我们等等要照着changeLocVal顺序去改,如果被改5的
# 就不再更动为其他的值,因此,按照我们的逻辑,最后5会有10个,3会有5个
# 程式开始
library(dplyr)
df <- mutate(df, rn = 1L:20L) # 新增row number
for (i in seq_along(changeLocVal))
df <- mutate(df, a = ifelse(is.na(a) & rn %in% changeLocVal[[i]]$loc,
changeLocVal[[i]]$value, a))
# 确定是否为NA还有是否在修改位置中,然后修改
# print出结果看看
print(select(df, -rn))
# a
# 1 3
# 2 5
# 3 3
# 4 5
# 5 5
# 6 5
# 7 3
# 8 5
# 9 NA
# 10 3
# 11 5
# 12 5
# 13 NA
# 14 5
# 15 5
# 16 NA
# 17 NA
# 18 5
# 19 3
# 20 NA
# 用table看看数量是否如同预期
table(df$a, useNA = "ifany")
# 3 5 <NA>
# 5 10 5
# 如果有速度上的问题,可以再试试看data.table
library(data.table)
DT <- data.table(a = rep(NA_real_, 20L))
DT[ , rn := .I]
for (i in seq_along(changeLocVal))
set(DT, setdiff(changeLocVal[[i]]$loc, which(!is.na(DT$a))), 1,
changeLocVal[[i]]$value)
DT[ , rn := NULL]
print(DT)
# a
# 1: 3
# 2: 5
# 3: 3
# 4: 5
# 5: 5
# 6: 5
# 7: 3
# 8: 5
# 9: NA
# 10: 3
# 11: 5
# 12: 5
# 13: NA
# 14: 5
# 15: 5
# 16: NA
# 17: NA
# 18: 5
# 19: 3
# 20: NA