我有一個名爲'data'的表。它有n列。每列都有相同的結構。 (即,具有兩個值的字符向量「是」,「否」)。我想重新編碼這些列,其中'是'標籤將是1,'不'標籤將是0.我目前使用for循環做如下。使用lapply或其他函數有更快的方法嗎?在沒有for循環的情況下更改表的列中的數據結構
for (i in (1:n)){
data[data[,i]=='no',i]=0
data[data[,i]=='yes',i]=1
}
我有一個名爲'data'的表。它有n列。每列都有相同的結構。 (即,具有兩個值的字符向量「是」,「否」)。我想重新編碼這些列,其中'是'標籤將是1,'不'標籤將是0.我目前使用for循環做如下。使用lapply或其他函數有更快的方法嗎?在沒有for循環的情況下更改表的列中的數據結構
for (i in (1:n)){
data[data[,i]=='no',i]=0
data[data[,i]=='yes',i]=1
}
假設data
是一個矩陣,那麼直截了當
ifelse(data=="yes", 1, 0)
看起來有吸引力。如果有可能是別的在data
不是「是」或「否」,則像
matrix(c(yes=1, no=0)[data], nrow(data))
會導致NA
值出現在這些地方。
這兩種解決方案均利用R
的傾向,即將操作同時應用於陣列的所有組件。第一個是本着這個問題所概述的嘗試的精神。第二個利用數組的聯合尋址:c(yes=1, no=0)
創建一個數組來執行轉換,[data]
通過[
(提取)函數執行轉換。
如果data
別的東西 - 如數據幀 - 這將是快速,輕鬆地將其轉換爲一個矩陣(as.matrix
),應用這些快速,簡單的解決方案,然後將其轉換回(as.data.frame
)。
apply()和gsub()是你的朋友。
# random data frame of yes and no
m <- data.frame(matrix(sample(c("yes","no"), 100, replace = T), 10))
# gsub each value
m <- apply(m, 2, function(y) gsub("yes","1",y))
m <- apply(m, 2, function(y) gsub("no","0",y))
# and assuming you want them as numeric and not character
m <- apply(m, 2, as.numeric)