※ 引述《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