2016-04-05 4 views
0

Мне нужно найти «9» в моей кадре данных и заменить его значением, которое стоит в другом столбце.Найти значение и заменить его в r

Например мой dataframe:

"1" "total_1_SNP20001" "mu" 1 1922 1369.25 1369.25 "." NA 
"2" "total_1_SNP20001" "person" 3 1922 91.52 91.52 "a" NA 
"3" "total_1_SNP20001" "barn.level.row" 17 1922 2.85 2.85 "A" NA 
"4" "total_1_SNP20001" "9" NA 1 1922 1369.25 "1369.25" NA 
"5" "total_1_SNP20002" "mu" 1 1921 1368.62 1346.47 "." NA 
"6" "total_1_SNP20002" "person" 3 1921 91.48 91.41 "a" NA 
"7" "total_1_SNP20002" "barn.level.row" 17 1921 2.85 2.85 "A" NA 
"8" "total_1_SNP20002" "SNP20002" 1 1921 0.12 0.12 "A" 0.72 

Здесь "9" NA 1922 1369.25 "1369.25" NA надо заменить на "SNP20001" 1 1921 0 0 "A" NA. Часть «SNP20001» должна поступать из столбца раньше (но минус total_1_ часть), а остальные - фиксированные значения. Как это сделать в R?

+0

Вы можете использовать это, чтобы заменить колонку, вам просто нужно настроить его на свой собственный код: 'л <- iris', 'ifelse (ir $ Petal.Length == 1.4, ir $ Sepal.Length [ir $ Petal.Length == 1.4]," Test ")', а затем вы можете использовать функцию splitstr для разделения значения первая колонка. – Bas

+0

Если вы разместите часть своего фрейма данных с помощью 'dput (dataframe)' Я могу вам помочь – Bas

+0

Функция 'gsub' может использоваться для замены значений. –

ответ

0

данные нагрузки

rawdata <- read.table(stringsAsFactors = FALSE, 
text = '"1" "total_1_SNP20001" "mu" 1 1922 1369.25 1369.25 "." NA 
"2" "total_1_SNP20001" "person" 3 1922 91.52 91.52 "a" NA 
"3" "total_1_SNP20001" "barn.level.row" 17 1922 2.85 2.85 "A" NA 
"4" "total_1_SNP20001" "9" NA 1 1922 1369.25 "1369.25" NA 
"5" "total_1_SNP20002" "mu" 1 1921 1368.62 1346.47 "." NA 
"6" "total_1_SNP20002" "person" 3 1921 91.48 91.41 "a" NA 
"7" "total_1_SNP20002" "barn.level.row" 17 1921 2.85 2.85 "A" NA 
"8" "total_1_SNP20002" "SNP20002" 1 1921 0.12 0.12 "A" 0.72') 

Редактировать столбец 3 только

Если вы хотите, чтобы изменить столбец 3, можно Заменить «9» в V3 значением в столбце перед, V2

modified1 <- within(rawdata, V3 <- ifelse(V3 == "9", V2, V3)) 
# Remove "total_1_" part 
modified1 <- within(modified1, V3 <- gsub("total_1_", "", V3)) 

Изменить столбец 3 и другие столбцы, а также

Но вы также хотели добавить Добавить фиксированные значения. Тогда это, вероятно, лучше, чтобы извлечь строки, которые вы хотите редактировать и редактировать их все сразу

editedlines <- subset(rawdata, V3 == "9") 
editedlines <- within(editedlines, { 
    V3 <- gsub("total_1_", "", V2) 
    V4 <- 1 
    V5 <- 1921 
    V6 <- 0 
    V7 <- 0 
    V8 <- "A" 
    V9 <- NA}) 
# Put editedlines back with the rest of the unmodified data 
modified2 <- rbind(subset(rawdata, V3 != "9"), 
        editedlines) 
# Arrange according to V1 if you prefer 
modified2 <- modified2[order(modified2$V1),] 
0

его немного грязный и будет работать только на определенных случаях, подобных фрейме данных, публикуемую, но его рабочая

df[,3] <- ifelse(df[,3] == "9", unlist(lapply(strsplit(df[,2],split = "_"), FUN = function(x) x[3])) , df[,3]) 

есть, вероятно, гораздо лучше за это.

1

Вот один из способов сделать это

library(stringr) 
df$V3 <- with(df, ifelse(V3==9, str_extract(V2, 'SNP[0-9]+'), V3)) 
df$V3 
#[1] "mu"    "person"   "barn.level.row" "SNP20001"  "mu"    "person"   "barn.level.row" "SNP20002" 

В качестве альтернативы, если вы не хотите использовать stringr то,

df$V3 <- with(df, ifelse(V3==9, sub('.*_([_])*', '', V2), V3)) 

DATA

dput(df) 
structure(list(V1 = 1:8, V2 = c("total_1_SNP20001", "total_1_SNP20001", 
"total_1_SNP20001", "total_1_SNP20001", "total_1_SNP20002", "total_1_SNP20002", 
"total_1_SNP20002", "total_1_SNP20002"), V3 = c("mu", "person", 
"barn.level.row", "9", "mu", "person", "barn.level.row", 
"SNP20002"), V4 = c(1L, 3L, 17L, NA, 1L, 3L, 17L, 1L), V5 = c(1922L, 
1922L, 1922L, 1L, 1921L, 1921L, 1921L, 1921L), V6 = c(1369.25, 
91.52, 2.85, 1922, 1368.62, 91.48, 2.85, 0.12), V7 = c(1369.25, 
91.52, 2.85, 1369.25, 1346.47, 91.41, 2.85, 0.12), V8 = structure(c(1L, 
3L, 4L, 2L, 1L, 3L, 4L, 4L), .Label = c(".", "1369.25", "a", 
"A"), class = "factor"), V9 = c(NA, NA, NA, NA, NA, NA, NA, 0.72 
)), .Names = c("V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8", 
"V9"), row.names = c(NA, -8L), class = "data.frame") 
Смежные вопросы